【问题标题】:Why inside ob_start file_put_contents is nowhere to be found?为什么在 ob_start file_put_contents 里面找不到?
【发布时间】:2018-06-16 13:29:25
【问题描述】:

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

ob_start("function123");

所以在函数“function123”里面我有这个:

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

但是我在任何地方都找不到这个文件。 PHP 脚本具有 777 权限,并且 file_put_contents 运行良好,因为当我在“function123”之外使用它时,它运行良好,并且文件出现在与 PHP 脚本相同的路径中。

如果我这样做

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

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

【问题讨论】:

  • 我不认为有足够的继续(你太少了)。例如,如何停止 OB?也许发布你的完整function123
  • 您是否尝试在回调中使用getcwd() 来查看工作目录是否确实更改了?它会回答你的最后一个问题。

标签: php ob-start


【解决方案1】:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多