webentwicklung-frage-antwort-db.com.de

SplFileInfo :: openFile (/ app/tmp/cache/persistent/cake_core_cake_console _): Stream konnte nicht geöffnet werden: Berechtigung in Zeile /lib/.../FileEngine.php 293 verweigert

Ich arbeite an einem CakePHP 2-Projekt. Es begann ursprünglich in 2.0.x und wurde kürzlich auf 2.1.0 migriert. Während des gesamten Entwicklungsprozesses habe ich die folgende Fehlermeldung erhalten.

Es erscheint unvorhersehbar am oberen Rand der Seite. Dies kann der Fall sein, wenn ich nur verschiedene Seiten ansehe oder sogar, nachdem ich einen Datensatz zur Datenbank hinzugefügt habe (der Datensatz wird dennoch ordnungsgemäß gespeichert).

Warning:
SplFileInfo::openFile(/var/www/cake_prj/app/tmp/cache/persistent/cake_core_cake_console_): 
failed to open stream: 
Permission denied in 
     /var/www/cake_prj/lib/Cake/Cache/Engine/FileEngine.php on line 293

Ich habe den Besitzer und die Gruppe des tmp-Ordners rekursiv auf Apache gesetzt und die Nachricht trotzdem erhalten. Außerdem habe ich dann rekursiv die Berechtigungen zum Lesen, Schreiben und Ausführen für alle festgelegt (chmod 777). Die Fehlermeldung wird weiterhin angezeigt.

Auch nach dem Ändern von Besitzer, Gruppe und Berechtigungen wird die betreffende Datei wie folgt geändert:

cake_prj/app/tmp/cache/persistent/cake_core_cake_console_

der Besitzer und die Gruppe werden auf root zurückgesetzt, und die Berechtigungen werden auf Standard zurückgesetzt.

Was könnte dieses Problem verursachen? Gibt es eine Möglichkeit sicherzustellen, dass bei jeder Generierung dieser Datei immer Apache: Apache mit Lese-/Schreib-/Ausführungsberechtigungen vorhanden ist?

20
penguin egg

Es gab dort einen Fehlerbericht http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 , aber es wurde davon ausgegangen, dass es sich nicht um einen Fehler handelt.

Was mir persönlich aufgefallen ist, ist, dass ein Dateieigentümer möglicherweise geändert wird, wenn Sie das Skript cake in der Konsole verwenden (z. B. um eine bake zu erstellen). Die geänderten Dateien gehören dann zu dem Benutzer, den Sie in der Konsole verwenden. 

Bedeutet das, dass Sie cake aufrufen, während Sie root sind? Oder haben Sie einen Root-Cron-Job, der ein Cake Shell-Skript aufruft?

Ich persönlich habe jetzt die Gewohnheit, chmod den gesamten tmp-Ordnerinhalt an den Apache-Benutzer zurückzugeben, nachdem er das cake-Skript verwendet hat, und es scheint zu verhindern, dass die Warnung erscheint.

15
nIcO

Sie können dieses Problem beheben, indem Sie in config.php eine Maske zu Ihrer Konfiguration hinzufügen

Cache::config('default', array(
    'engine' => 'File',
    'mask' => 0666,
));
24
rtconner

Anstelle des Schreibens/Lesezugriffs für alle im tmp/cache-Verzeichnis habe ich Folgendes getan:

chgrp -R www-data app/tmp
chmod -R g+rw app/tmp 
find app/tmp -type d -exec chmod g+s {} \;

Wenn Sie die Gruppe der Verzeichnisse auf den Apache-Benutzer einstellen und dann das Setgid-Bit einstellen, können Sie sicherstellen, dass die in diesem Verzeichnis erstellten Dateien unabhängig von dem Benutzer, der das Shell-Skript ausführt, die richtigen Gruppenberechtigungen erhalten. Auf diese Weise können Sie auch Lese-/Schreibberechtigungen für "andere" Benutzer ausschließen.

7
Code Commander

Ich denke, der Grund des Problems ist bereits erklärt worden, da der Cron unter root-Benutzer ausgeführt wird und die erstellten Dateien in tmp nicht für Webbenutzer zugänglich sind. Die anderen Lösungen funktionierten nicht für mich und ich wollte die tmp-Berechtigungen nicht auf 777 setzen. Am Ende stellte ich einen Cron-Job für den Web-Benutzer ein, insbesondere in Debian 

crontab -u www-data -e

Aus dieser Antwort entnommen Wie kann in crontab festgelegt werden, von welchem ​​Benutzer das Skript ausgeführt werden soll?

2
dav

Wenn Sie in CakePHP2 auf den SplFileInfo-Fehler stoßen und Sie absolut sicher sind, dass Ihre Datei-/Verzeichnisberechtigungen ordnungsgemäß eingerichtet sind, müssen Sie auch die Version PHP überprüfen. Für Cake2 ist PHP 5.2.8 oder höher erforderlich. Wenn Sie die falsche Version verwenden, werden Sie normalerweise auf der Standardseite benachrichtigt. Sie werden jedoch nicht benachrichtigt, wenn Sie Ihre App auf einem Server entwickeln und verschob es dann zu einem anderen.

Dieser Fehler ist aufgetreten, nachdem eine Cake2-App auf einem PHP5.3-Server entwickelt und dann auf einen PHP 5.1-Server verschoben wurde. Ein Upgrade auf 5.2.17 (über 5.2.8) hat das Problem behoben.

0
Joseph

Benutze das ..

cd cakephp/app/tmp/cache/persistent 

Sudo chmod 666 myapp*

cd ..

cd models

Sudo chmod 666 myapp*
0
Ashish

Sie müssen das Verzeichnis app/tmp für den Webserver schreibbar machen. Finden Sie heraus, unter welchem ​​Benutzer Ihr Webserver ausgeführt wird (in meinem Fall _www), und ändern Sie den Besitz des Verzeichnisses app/tmp in diesen Benutzer: $ chown -R _www app/tmp

0
andres_v

Eine andere Lösung. Berechtigungskonflikte aufgetreten, da mehrere Benutzer dieselben Dateien verwenden. Wenn wir also das Cache-Verzeichnis in mehrere Unterverzeichnisse aufteilen, treten keine Konflikte auf und es ist keine Änderung der Standardberechtigung für Verzeichnisse und Dateien erforderlich.

Im Folgenden wird jedes Unter-Cache-Verzeichnis durch den Typ des PHP-API-Handlers definiert:

define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS);
  • Als Browser der Website ist Apache der aktive Benutzer. Das Unterverzeichnis Lautet cache/Apache2handler .
  • Wenn ein Stapel ausgeführt wird, ist der aktive Benutzer root oder der Benutzer zum Anmelden. Und das Unterverzeichnis ist cache/cli .

Auf der anderen Seite kann das aktuelle Benutzerkonto zum Benennen von Unterverzeichnissen verwendet werden. Check um Wie prüfe ich, unter welchem ​​Benutzer php läuft?

0
Nguyen Van Vinh