【问题标题】:Writing to php://stderr写入 php://stderr
【发布时间】: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");

标签: php windows xampp stderr


【解决方案1】:

没关系,明白了。我不太明白php://stderrerror_log 之间的区别:

error_log 写入 PHP 错误日志(例如:D:\xampp\php\logs\php_error_log)

php://stderr 写入服务器/Apache 错误日志(例如:D:\xampp\apache\logs\error.log)

希望这对其他人有所帮助。

【讨论】:

  • 当我在 php://stderr 中时,stderr 是指服务器的错误日志还是 Apache 的错误日志? (我知道它们在实践中可能是相同的,但我对语义很好奇。)
  • 从技术上讲,php://stderr 指的是进程的 STDERR 流,但是当作为模块在 Apache 主机中运行时,这将是 Apache 进程的 STDERR。如果是 CLI 或 CGI 应用程序,则情况并非如此。
  • @richremer,我的 STDERR 成功写入 C:\xampp\apache\logs\error.log,但 STDOUT 会写入哪里?
  • STDOUT 被发送到发出请求的客户端。每当您在 PHP 中回显、打印或使用模板时,它都会转到 STDOUT(忽略任何缓冲)。这是对请求的响应。
【解决方案2】:

如果您只是运行 PHP 内置 Web 服务器(自 PHP 5.4.0 起),那么 php://stderr 将输出到启动 PHP 内置 Web 服务器的控制台屏幕上。

【讨论】:

    【解决方案3】:

    你不能file_put_contents进入STDERR; STDERR 是一个流资源(已经打开)。所以你只能fwrite到STDERR。请看https://www.php.net/manual/en/features.commandline.io-streams.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多