2016-04-15 18 views
0

Ich habe eine Anwendung erstellt, die ein Caching-Skript in einer Windows/Wamp-Umgebung hat. Die Caching-Funktion dieses Skripts darf nur einmal gleichzeitig ausgeführt werden.PHP fopen 'x +' funktioniert nicht auf ubuntu

Um dies zu erreichen, habe ich eine 'Sperrdatei' verwendet, um zu prüfen, ob sie existiert.

Unter Windows funktioniert dieses Skript gut. Aber jetzt ist es in eine Ubuntu-Umgebung verschoben, funktioniert nicht.

<?php 
    date_default_timezone_set('Europe/Amsterdam'); 
    ini_set('max_execution_time', 300); 
    ignore_user_abort(true); 

    $path = 'locked.txt'; 

    if ($lock = fopen($path,'x+')) { 
     fwrite($lock,time()); 
     fclose($lock); 
     sleep(10); 
     unlink($path); 
    } 
?> 

Fehler: fopen(locked.txt): failed to open stream: Permission denied

+3

'@ fopen' unterdrückt mögliche Fehler, die sonst auf das Problem hinweisen würden. – apokryfos

+0

@apokryfos entfernte die Unterdrückung '@'. Aber es gibt keine Fehler. Ich habe meinen Beitrag auch mit einem einfacheren Code bearbeitet. – kgongonowdoe

+1

Kopieren Sie Ihren Code. Funktioniert gut auf meinem 14.04 Ubuntu. Stellen Sie sicher, dass Sie Ausführungsberechtigungen für das Verzeichnis haben, da Sie nicht löschen können, wenn Sie dies nicht tun. – apokryfos

Antwort

1

Von der PHP-Dokumentation (etwas paraphrasiert):

x+ Create and open for reading and writing; place the file pointer at the beginning of the file. If the file already exists, the fopen() call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call.

Aus Ihrer Beschreibung Sie versuchen, eine Datei als Lock-Datei zu verwenden, mit dem "x +" Flag, um sicherzustellen, dass Sie eine bereits gesperrte Datei nicht sperren.

Das Problem ist, dass die Migration von Windows zu * NIX-Systemen (wie Ubuntu) Sie sich mit dem Unterschied im Berechtigungssystem vertraut machen müssen.

Die Kurzgeschichte ist:

Jede Datei und Ordner „gehört“ zu einem Benutzer.

Der Benutzer, der eine Datei in einem Verzeichnis erstellen möchte, benötigt mindestens eine Ausführungs- und Schreibberechtigung für dieses Verzeichnis.

In diesem Sinne müssen Sie sicherstellen, dass der aktuelle Benutzer Schreib- und Ausführungsberechtigungen für das Verzeichnis mit dem Skript hat und um das Skript tatsächlich auszuführen, benötigen sie auch Leseberechtigungen für das Verzeichnis (zusätzlich zu Leseberechtigungen auf dem Skript). Stellen Sie sicher, dass das Verzeichnis über Lese-, Schreib- und Ausführungsberechtigungen (Kennzahl Nr. 7) für den Benutzer verfügt, der das Skript ausführt. Wenn Sie das Skript über eine Webschnittstelle ausführen, lautet dieser Benutzer www-data.

Im Allgemeinen chmod 777 /directory/with/script sollte funktionieren und Lese-Schreib-Ausführen-Berechtigungen für alle Benutzer für das Verzeichnis gewähren.

+0

Vielen Dank! Ich verstehe das Problem und die Lösung. Eine kurze Frage: Was ist der Standard-Erlaubniswert (wobei 777 vermutlich das Lesen, Schreiben und Bearbeiten für alle erlaubt, was ist der Standardwert (wo Apache/PHP nicht schreiben durfte), bevor ich ihn änderte). – kgongonowdoe

+1

Ich denke, der Standardwert für ein neues Verzeichnis in ubunty ist 775 (Benutzer und Gruppe können lesen, schreiben und ausführen), aber es gibt wahrscheinlich eine Möglichkeit, dies zu ändern, und sie kann für andere Unix-ähnliche Betriebssysteme variieren.Wahrheit ist ein Verzeichnis ohne "Ausführen" Berechtigungen kann nicht als ein Verzeichnis arbeiten, so dass jeder in der Lage sein wird zu lesen oder zu schreiben muss auch ausführen Berechtigungen für das Verzeichnis. – apokryfos