2016-04-03 1 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'); 
} 
?> 

ответ

0

Поведение в ожидается в соответствии с manual page for register_shutdown_function():

Рабочий каталог скрипта может измениться внутри функции отключения при некоторых веб-серверов, например Apache.

Я не знаю причины этого.

Смежные вопросы