为什么无法找到ob_start file_put_contents?

时间:2018-06-16 13:29:25

标签: php ob-start

我真的需要在代码中使用带有PHP的ob_start。所以我有这个:

ob_start("function123");

所以内部功能“function123”我有这个:

file_put_contents("aaa.txt","xxxx");

但是我无法在任何地方找到这个文件。 PHP脚本具有777权限,file_put_contents正常工作,当我使用它“oustide”“function123”时,它工作正常,文件显示在与PHP脚本相同的路径中。

但是,如果我这样做

file_put_contents("/main/folder/aaa.txt","xxxx");

有效。那么ob_start使用不同的范围/路径来创建文件吗?奇怪的是,如果我将file_get_contents与相对路径一起使用,它的工作原理与之相同:路径与当前PHP脚本路径相对。

1 个答案:

答案 0 :(得分:0)

ob_start函数在调用用户定义的回调时可能会更改PHP进程的工作目录。这是documented in the manual

  

某些Web服务器(例如Apache)在调用回调函数时会更改脚本的工作目录。您可以通过例如更改它回调函数中的chdir(dirname($ _ SERVER ['SCRIPT_FILENAME']))。

您可以通过获取脚本路径或文档根目录并使用chdir()自行更改工作目录来解决此问题。

我不确定这是否是问题,因为当我使用Apache 2.4测试时,一切似乎都按预期工作(即回调中没有目录更改)。无论如何,你可能会考虑做这样的事情,在回调之外打开文件,而PHP进程的PWD仍然是好的:

<?php

$handle = fopen('output.txt','w');
$callback = function($buffer, $phase) use($handle) {
    fwrite($handle,$buffer);
    return '';
};

ob_start($callback);
echo 'Hello, World!' . PHP_EOL;
ob_end_flush();
fclose($handle);