Unable to write to directory [app/temp]

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Papoušek
Člen | 16
+
0
-

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';
Aurielle
Člen | 1281
+
0
-

Co si přečíst text té výjimky?
Nastav chmod tempu na 777.

Papoušek
Člen | 16
+
0
-

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)

Papoušek
Člen | 16
+
0
-

Tak jsem nakonec zjistil, ze je chyba v nastavení serveru. Práva u adresářů jsou sice dobře, ale vytvýření souborů brání selinux. To způsobilo to, že starý FileStorage neřval, ale nový ano.

westrem
Člen | 398
+
0
-

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.