我正在尝试使用php://stderr用于写入日志以工作。我使用的是Slim框架,它利用@fopen('php://stderr', 'w')
进行日志记录,我真的希望它能正常工作。
以下测试用例应该有效,但只有第一个有效:
// 1. error_log - works fine
error_log("Written through the error_log function", 0);
// 2. PHP wrapper, ie php://stderr - does not work
$stderr = fopen( 'php://stderr', 'w' );
fwrite($stderr, "Written through the PHP error stream" );
fclose($stderr);
// 3. PHP wrapper also, different syntax, just to be safe - no effect either
file_put_contents( "php://stderr","Hello World" );
// 4. PHP wrapper, this time using this elusive constant referred to in the manual - result: "Notice: Use of undefined constant STDERR - assumed 'STDERR' ", ie: failed also!
file_put_contents( STDERR, "Hello World" );
我一直在浏览PHP手册和谷歌搜索,但没有太多帮助。
特别是,PHP包装手册中的以下引用令人困惑:
建议您只需使用常量STDIN、STDOUT和STDERR,而不是使用这些[参考php://stdin,php://stdout和php://stderr]包装。">
。。。考虑到上面未定义的常量通知。(我怀疑这些常量可能只用于PHP CLI?-但我引用的页面没有说明。)
我一直在想这是否是Windows的事情,因为我正在用PHP 5.3.8运行XAMPP进行开发,但考虑到谷歌上缺乏主题和PHP.net上的评论,我不再那么确定了。我现在没有访问生产服务器日志的权限进行测试。
没关系,明白了。我不太明白php://stderr
和error_log
:之间的区别
error_log
写入PHP错误日志(例如:D:\examplep\PHP\logs\PHP_error.log)
php://stderr
写入服务器/Apache错误日志(例如:D:\examplep\Apache\logs\error.log)
希望这能帮助其他人。
如果您只是运行PHP内置的web服务器(从PHP 5.4.0开始),那么php://stderr
将输出到启动PHP内置web服务器的控制台的屏幕上。
您不能将file_put_contents
写入STDERR;STDERR是一个流资源(已打开)。所以你只能从fwrite
到STDERR。请参阅https://www.php.net/manual/en/features.commandline.io-streams.php