Unable to write to directory [app/temp]
- Papoušek
- Člen | 16
Ahoj,
snažím se nasadit Nette 0.9.5 stable tam, kde byla původně verze 0.8. A vyhazuje mi to tuto výjimku:
PHP Fatal error: Uncaught exception 'InvalidStateException' with message 'Unable to write to directory '/var/www/html/interlos-2010/document_root/../app/temp'. Make this directory writable.' in /var/www/html/interlos-2010/libs/Nette/Caching/FileStorage.php:149
Stack trace:
#0 /var/www/html/interlos-2010/libs/Nette/Environment/Configurator.php(253): FileStorage->__construct('/var/www/html/i...')
#1 [internal function]: Configurator::createCacheStorage(NULL)
#2 /var/www/html/interlos-2010/libs/Nette/Utils/Callback.php(97): call_user_func_array(Array, Array)
#3 /var/www/html/interlos-2010/libs/Nette/Environment/ServiceLocator.php(140): Callback->invoke(NULL)
#4 /var/www/html/interlos-2010/libs/Nette/Environment/Environment.php(353): ServiceLocator->getService('Nette\\Caching\\I...', NULL)
#5 /var/www/html/interlos-2010/libs/Nette/Environment/Environment.php(449): Environment::getService('Nette\\Caching\\I...')
#6 /var/www/html/interlos-2010/libs/Nette/Loaders/RobotLoader.php(365): Environment::getCache('Nette.RobotLoad...')
#7 /var/ in /var/www/html/interlos-2010/libs/Nette/Caching/FileStorage.php on line 149
Pokud nahradím nový FileStorage.php tím z 0.8, vše funguje, jak má. Kde dělám chybu?
Ze starého FileStorage.php jsem vymazal řádky:
require_once dirname(__FILE__) . '/../Object.php';
require_once dirname(__FILE__) . '/../Caching/ICacheStorage.php';
- Papoušek
- Člen | 16
temp má práva 777 samozřejmě nastavená. Kdyby neměl, tak výjimku bude vyhazovat i FileStorage z verze 0.8.
EDIT: starý FileStorage jen nevyhazuje výjimku – temp je i po navštívení stránky prázdný
EDIT 2:
Napsal jsem si script, který dělá stejnou kontrolu jako FileStorage v konstruktoru:
<?php
$dir = $GLOBALS['argv'][1];
// Simple check - Nette 0.8
echo "Simple check: ";
if (!is_dir($dir) || !is_writable($dir)) {
echo "Directory [$dir] is not writable.";
}
else {
echo "Directory [$dir] is writable.";
}
echo "\n";
echo "-----------------";
echo "\n";
// Another check - Nette 0.9.5
echo "Another check: ";
$uniq = uniqid('_', TRUE);
umask(0000);
if (!mkdir("$dir/$uniq", 0777)) { // intentionally @
echo "Directory [$dir] is not writable.";
}
else {
echo "Directory [$dir] is writable.";
}
echo "\n";
A když jej spustím:
sudo -u apache php check-writable.php /var/www/html/interlos-2010/document_root/../app/temp
vypadá to, že je vše v pořádku:
Simple check: Directory [/var/www/html/interlos-2010/document_root/../app/temp] is writable.
-----------------
Another check: Directory [/var/www/html/interlos-2010/document_root/../app/temp] is writable.
Editoval Papoušek (13. 8. 2010 10:54)
- westrem
- Člen | 398
Papi, nebude problem v zaplem safe_mode?
Check vo verzii 0.8 totiz vyuziva is_writable
, ktory safe_mode
nekontroluje, kdezto verzia 0.9.5 pouziva mkdir
, ktory uz
kontroluje UID. (Obecne je sposob v 0.9.5 lepsi preto 0.8 mohla hlasit
writable aj ked v skutocnosti nie je).
Skript, ktory mas napisany robi sice to iste, ale podla mna to zbehlo pretoze to volas ako sudo pod apache, co nemusi byt rovnaky pripad ked sa vola skript z browsera.