2016-04-03 67 views
1

內工作我在我的腳本中玩輸出緩衝,並偶然發現意外的行爲。PHP的file_put_contents不能按預期在register_shutdown_function()

寫入一個文件可以在我的腳本的其他地方工作,但是在進入register_shutdown_function()函數後它並沒有這麼做。

我收到警告,告訴我我沒有寫入文件的權限。所以我檢查了我所在的路徑。顯然當前的工作目錄從進入關機功能的那一刻起就消失了。

我的問題並不在於如何解決這個問題;正如你所看到的,我只是包含了正確的道路。我的問題是,這是預期的行爲,如果是這樣,它背後的邏輯是什麼?

我在OSX/MAMP-PRO上,如果有問題的話。還沒有在另一個盒子上試過它。

<? 
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'); 
} 
?> 

回答