牛骨文教育服务平台(让学习变的简单)
博文笔记

解决 php-fpm php://stdout 命令行 打印 失效问题

创建时间:2015-11-06 投稿人: 浏览次数:1220
本文原地址: http://blog.csdn.net/zhangrui_fslib_org/article/details/49681563 转载请注明出处,有疑问或错误请发邮件到zhangrui@fslib.org
延伸阅读:php-fpm 生产环境 调试信息 日志系统 设计 支持 thinkphp   http://blog.csdn.net/zhangrui_fslib_org/article/details/50487174 

<!DOCTYPE html>
<html>
<body>

<h1>我的第一张 PHP 页面</h1>

<?php
echo "Hello World!";
$fd = fopen("php://stdout", "w");
    if ($fd) {
        fwrite($fd, "7777888");
        fwrite($fd, " ");
        fclose($fd);
    }
?>

</body>
</html>

对以上代码,如果用php-cgi运行,在命令行(windows和linux)都会获得如下结果

7777888

而对于生产环境的php-fpm是关闭了stdout的,源码如下

int fpm_stdio_init_main() /* {{{ */
{
 int fd = open("/dev/null", O_RDWR);

 if (0 > fd) {
  zlog(ZLOG_SYSERROR, "failed to init stdio: open("/dev/null")");
  return -1;
 }

 if (0 > dup2(fd, STDIN_FILENO) || 0 > dup2(fd, STDOUT_FILENO)) {
  zlog(ZLOG_SYSERROR, "failed to init stdio: dup2()");
  close(fd);
  return -1;
 }
 close(fd);
 return 0;
}


经研究,在linux下可让程序显示加载不同的动态库,从而可以在不修改php源码的基础上解决此问题,配上管道捕捉效果如下

Please slecet a registered process:
1:[2015-11-06 12:27:39.966]fsServer:366(127.0.0.1)
2:[2015-11-06 12:27:40.916]php-fpm:405(127.0.0.1)
3:[2015-11-06 12:27:41.817]sos:367(127.0.0.1)
use name or index:2
100316/1323588888(doRecvDataFunction_011)--Select is:"php-fpm:405(127.0.0.1)".
Start debug stream:"php-fpm:405(127.0.0.1)".
7777888
7777888
7777888
7777888
7777888
7777888



   
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。