Я играю с буферизацией вывода в своем скрипте и наткнулся на неожиданное поведение.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');
}
?>