PHP文件输出内容;在register_shutdown_function()中无法按预期工作


PHP file_put_contents doesn't work as expected within in 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');
}
?>

根据register_shutdown_function()的手动页面,行为是所期望的:

在某些web服务器(如Apache)下,脚本的工作目录可以在关闭功能内更改。

我不知道这背后的原因。