为什么我不能写到/ dev / stdout,但是php:// stdout可以工作?

马丁·威克曼

我正在尝试使用PHP和Apache(在Docker中在前台运行)写入stdout(或stderr)。

这些作品:

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

更多信息:

  • 我尝试error_log = /dev/stdout在php.ini中进行设置,但不起作用
  • 我尝试了Docker命令RUN ln -sf /dev/stdout stdout.log,然后stdout.log用PHP编写,但是没有。

再次说明,php:// stdout在做什么,我不这样做?

马丁·威克曼

原因是Apache分叉并将用户更改为特权较低的用户(“ apache”用户),该用户没有写权限/dev/stdout解决这个问题没有简单的方法,所以我最后写了一个脚本。

该脚本创建一个文件(管道),该文件通过“ cat”进程连接,该进程写入标准错误(作为根):

mkfifo -m 600 logpipe
chown apache:apache logpipe
cat <> logpipe 1>&2 &
CAT=$!

# Start apache
/usr/sbin/httpd -D FOREGROUND

# Kill the cat after apache dies
kill $CAT

现在您可以error_log = logpipe在php.ini中进行设置,所有php错误都将发送到stderr。

至于为什么php://stdout可行,我的猜测是PHP使用/dev/stdoutApache已经打开的文件句柄(to )。

更多细节在这里

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

git clone写到sderr,很好,但是为什么我不能重定向到stdout

sys .__ stdout__可以,但是sys.stdout不能

为什么我的checkall函数可以工作,但是uncheckall函数不能正常工作

为什么AngularJS $ http .success可以工作,但是.then不能工作?

/ dev / stdin,/ dev / stdout和/ dev / stderr的移植性如何?

回显或打印/ dev / stdin / dev / stdout / dev / stderr

FILE *“ / dev / stdout”和stdout之间的区别

命令stdout到/ dev / null

为什么我不能写cout << a == b; 但可以写cout <<(a == b);

为什么我可以从cronjob中的Bash脚本创建但不能写入文件?

为什么我可以使用/ dev?

React webpack dev server 可以工作,但是当我创建 prod 包时,我收到参考错误“require is not defined”

为什么 >/dev/null 不能按预期工作?

为什么PHP Sessions Memcached可以工作,但Memcache不能工作?

npm run build在我的vue cli项目中抛出错误,但是npm run dev可以正常工作

为什么我不能使用“ from sys import stdout”重定向STDOUT?

/ dev / stdout权限拒绝Tomcat访问日志

为什么我的php`if`不能总是正常工作?

为什么我的搜索 php 代码不能正常工作?

PHP 为什么我的过滤不能正常工作

为什么我的正则表达式可以在PHP中工作,但不能在JavaScript中工作?

为什么php脚本可以在免费托管上工作,而在我的vps上却不能工作?

为什么`gem install`可以工作,但是`bundle install`不能工作

为什么`。/ file.py`可以工作,但是`bash file.py`不能工作?

为什么String.Format可以工作但是SqlCommand.Parameters.Add不能工作?

为什么JavaBridge可以工作但是JavaBridgeTemplate621不能工作

PowerShell:为什么有时我不能重定向外部方法的stdout和stderr?

是什么负责将/ dev / pts / 10与stdout / stdin / stderr连接?

/ dev / tty和stdin / stdout / stderr之间是什么关系?