PHP file_put_contents在register_shutdown_function()

时间:2016-04-03 10:28:35

标签: php output-buffering

我正在使用我的脚本中的输出缓冲,并偶然发现意外行为。

写入文件可以在我的脚本中的其他任何地方使用,但是在输入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');
}
?>

1 个答案:

答案 0 :(得分:0)

根据manual page for register_shutdown_function()

,行为
  

脚本的工作目录可以在某些Web服务器下的关闭功能内部进行更改,例如:的Apache。

我不知道这背后的原因。