为什么在ob_start里面找不到file_put_contents?

Why inside ob_start file_put_contents is nowhere to be found?

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

ob_start("function123");

所以内部函数 "function123" 我有这个:

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

但是我在任何地方都找不到这个文件。 PHP 脚本有 777 权限,file_put_contents 工作正常,因为当我使用它取代 "function123" 时,它工作得很好,文件出现在与 [=32= 相同的路径中] 脚本。

但是如果我这样做

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

有效。那么 ob_start 是否使用不同的 scope/path 来创建文件?奇怪的是,如果我将 file_get_contents 与相对路径一起使用,它会完全按照预期工作:路径是相对于当前 PHP 脚本路径。

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

Some web servers (e.g. Apache) change the working directory of a script when calling the callback function. You can change it back by e.g. chdir(dirname($_SERVER['SCRIPT_FILENAME'])) in the callback function.

您可以通过获取脚本路径或文档根目录并使用 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);