如何将STDOUT重定向到PHP中的文件?

2022-08-30 09:28:12

下面的代码几乎有效,但这不是我真正的意思:

ob_start();
echo 'xxx';
$contents = ob_get_contents();
ob_end_clean();
file_put_contents($file,$contents);

有没有更自然的方式?


答案 1

可以将STDOUT直接写入PHP中的文件,这比使用输出缓冲更容易,更直接。

在脚本的开头执行此操作:

fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
$STDIN = fopen('/dev/null', 'r');
$STDOUT = fopen('application.log', 'wb');
$STDERR = fopen('error.log', 'wb');

为什么在一开始你可能会问?不应打开任何文件描述符,因为当您关闭标准输入、输出和错误文件描述符时,前三个新描述符将成为新的标准输入、输出和错误文件描述符。

在我这里的例子中,我将标准输入重定向到 /dev/null,并将输出和错误文件描述符重定向到日志文件。这是在 PHP 中制作守护程序脚本时的常见做法。

要写入应用程序.log文件,这就足够了:

echo "Hello world\n";

要写入错误.log,必须执行以下操作:

fwrite($STDERR, "Something went wrong\n"); 

请注意,当您更改输入、输出和错误描述符时,内置的 PHP 常量 STDIN、STDOUT 和 STDERR 将变得不可用。PHP不会将这些常量更新为新的描述符,并且不允许重新定义这些常量(毕竟它们被称为常量是有原因的)。


答案 2

这是一种转移输出的方法,这似乎是原始问题

$ob_file = fopen('test.txt','w');

function ob_file_callback($buffer)
{
  global $ob_file;
  fwrite($ob_file,$buffer);
}

ob_start('ob_file_callback');

更多信息在这里:

http://my.opera.com/zomg/blog/2007/10/03/how-to-easily-redirect-php-output-to-a-file


推荐