【发布时间】:2012-11-29 14:21:01
【问题描述】:
我正在尝试使用 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 手册on wrappers 中的以下引用令人困惑:
建议您简单地使用常量 STDIN、STDOUT 和 STDERR,而不是使用这些 [引用 php://stdin、php://stdout 和 php://stderr] 包装器手动打开流。”
...鉴于上面未定义的常量通知。 (我怀疑这些常量可能仅与 PHP CLI 一起使用?-但我引用的页面没有说明。)
我一直想知道这是否可能是 Windows 的事情,因为我正在使用 PHP 5.3.8 运行 XAMPP 进行开发,但鉴于 Google 和 PHP.net 上的 cmets 缺乏主题,我不太确定了。我现在无法访问我的生产服务器日志以供我测试。
【问题讨论】:
-
哦,谢天谢地,我以为我是唯一一个拥有奇怪的偶尔未定义的
STDERR常量的人。您在哪里测试了您的示例代码?当您通过 Apache 完全独立运行它时会发生什么?它应该出现在 Apache 错误日志中,对吧?它不是仅在您处于命令提示符和/或通过该框架时才出现吗? -
当我运行脚本时,案例 1 显示正常,案例 4。仅因为缺少常量而显示在日志中(考虑到这些是仅限 CLI 的,现在这很有意义)。但是,案例 2 和案例 3 无处可寻。
-
(2) 在这里的 cli 和 apache 中完美运行(但不要忘记附加 PHP_EOL),
file_put_contents不能(即使使用FILE_APPEND也不行)。那就是这里的 PHP 作为一个模块,你有没有机会将它作为(快速)cgi 运行? -
STDERR不打开也可以使用:fwrite(STDERR,"xxx");