2016-04-03 5 views
1

Ich spiele mit Ausgabepufferung in meinem Skript und stolperte über unerwartetes Verhalten.PHP file_put_contents funktioniert nicht wie erwartet innerhalb von register_shutdown_function()

Das Schreiben in eine Datei funktioniert überall sonst in meinem Skript, aber nach der Eingabe der register_shutdown_function() - Funktion geschieht dies nicht.

Ich bekomme eine Warnung, dass ich keine Berechtigung habe, in die Datei zu schreiben. Also überprüfte ich, in welchem ​​Pfad ich mich befand. Anscheinend verschwindet das aktuelle Arbeitsverzeichnis von dem Moment an, an dem Sie die Shutdown-Funktion aufrufen.

Meine Frage ist nicht besonders auf, wie man das löst; Wie Sie sehen können, habe ich nur den richtigen Pfad angegeben. Meine Frage ist, ist das erwartete Verhalten und wenn ja, was ist die Logik dahinter?

Ich bin auf OSX/MAMP-PRO, wenn das zählt. Habe es noch nicht auf einer anderen Box probiert.

<? 
register_shutdown_function('_lib_bootstrap_end'); 
ob_start(); 
_lib_bootstrap_start(); 
file_put_contents('test1.log','this_one_writes_fine'); 

function _lib_bootstrap_start() 
{ 
    echo getcwd()."\n"; // prints '/Users/macbook/Documents/WWW'; 
    file_put_contents('test2.log','this_one_writes_fine'); 
} 

function _lib_bootstrap_end() 
{ 
    global $html; 

    file_put_contents('test3.log', 'this_one_triggers_warning'); 
    $html[] = ob_get_contents(); 
    $return = implode("\n",$html); 
    ob_end_clean(); 

    echo $return; 
    echo getcwd()."\n"; // prints '/'; 

    file_put_contents('test4.log', 'this_one_triggers_warning'); 
    // prints 'Warning: file_put_contents(test4.log): failed to open stream: Permission denied in ob_problem.php on line 24' 

    file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.'test5.log','this_one_writes_fine'); 
} 
?> 

Antwort

0

Das Verhalten wird erwartet nach dem manual page for register_shutdown_function():

des Skripts Arbeitsverzeichnis kann in der Shutdown-Funktion unter bestimmten Web-Server ändern, zum Beispiel Apache.

Ich kenne die Gründe dafür nicht.

Verwandte Themen