【发布时间】:2019-10-28 05:25:09
【问题描述】:
我正在尝试使用 PHP 和 Apache(在 Docker 的前台运行)写入标准输出(或标准错误)。
这些作品:
file_put_contents( "php://stderr","works" );
file_put_contents( "php://stdout","works" );
$fh = fopen('php://stdout','w'); fwrite($fh, "works");
但这些不是:
$stdout = fopen ("/dev/stdout","w"); fwrite($stdout, "fails");
$stderr = fopen ("/dev/stderr","w"); fwrite($stderr, "fails");
echo "fd1 exists:" . (file_exists('/proc/self/fd/1') ? 'yes' : 'no');
echo "fd1 writable:" . (is_writable('/proc/self/fd/1') ? 'yes' : 'no');
echo "stdout exists:" . (file_exists('/dev/stdout') ? 'yes' : 'no');
echo "stdout writable:" . (is_writable('/dev/stdout') ? 'yes' : 'no');
file_put_contents( "/proc/self/fd/1", "fails" );
file_put_contents( "/proc/self/fd/2", "fails" );
file_put_contents( "/dev/stdout", "fails" );
fwrite(STDOUT, 'fails');
fwrite(STDERR, 'fails');
/dev/stdout 确实存在,但不可写。 fopen('/dev/stdout') 也返回 FALSE。
fd1 exists:yes
fd1 writable:no
stdout exists:yes
stdout writable:no
更多信息:
- 我尝试在 php.ini 中设置
error_log = /dev/stdout,但它不起作用 - 我尝试了 Docker 命令
RUN ln -sf /dev/stdout stdout.log,然后在 PHP 中写入stdout.log,但没有。
再说一遍,php://stdout 做了什么我没有做的事?
【问题讨论】:
-
可能是更好的答案,但您尝试过
STDOUT和STDERR吗?你不需要打开这些,它们已经打开了,所以写吧。 -
STDOUT/ERR 仅在 CLI afaik 中可用。无论如何,当我尝试它们时它们不起作用。不过还是谢谢。
-
见github.com/moby/moby/issues/31243。 “尝试以非 root 用户身份写入 /dev/stdout 时收到权限错误”
-
@ceejayoz 可能是这种情况,尽管我确实尝试过
chmod 777 /dev/stdout无济于事。另外,这如何解释为什么php://stdout有效而 /dev/stdout 无效?