让PHP proc_open()读取一个PhantomJS流,只要png被创建就可以。[英] Get PHP proc_open() to read a PhantomJS stream for as long as png is created

问题描述

我有一个依赖于 shell_exec() 的 PHP 脚本(因此)99% 的时间都在工作.该脚本执行了一个生成图像文件的 PhantomJS 脚本.然后使用更多的 PHP 以某种方式处理该图像文件.问题是有时 shell_exec() 会挂起并导致可用性问题.读这个https://github.com/ariya/phantomjs/issues/11463我了解到 shell_exec() 是问题所在,切换到 proc_open 可以解决挂起问题.

问题在于,当 shell_exec() 等待执行的命令完成时 proc_open 没有,因此在生成图像时,跟随它并处理生成图像的 PHP 命令会失败.我在 Windows 上工作,所以 pcntl_waitpid 不是一个选项.

我想要做的是不断地让 PhantomJS 输出一些东西(任何东西),以便 proc_open 可以通过它的标准输入管道读取,这样我就可以安排图像处理 PHP 函数在目标图像时立即开始工作文件准备好了.

这是我的 phantomJS 脚本:

interval = setInterval(function() {
  console.log("x");
}, 250);
var page = require('webpage').create();
var args = require('system').args;
page.open('http://www.cnn.com', function () {
  page.render('test.png');
  phantom.exit();
});

还有我的 PHP 代码:

ob_implicit_flush(true);
$descriptorspec = array(
    0 => array("pipe", "r"),  // stdin
    1 => array("pipe", "w"),  // stdout
    2 => array("pipe", "w")   // stderr 
);

$process = proc_open ("c:\phantomjs\phantomjs.exe /test.js", $descriptorspec, $pipes);
if (is_resource($process))
{
while( ! feof($pipes[1]))
  {
     $return_message = fgets($pipes[1], 1024);
     if (strlen($return_message) == 0) break;
     echo $return_message.'<br />';
     ob_flush();
     flush();
  }
}

生成了 test.png,但我没有得到一个 $return_message.我做错了什么?

推荐答案

As Bill Shander 建议 在您链接的 github 问题中,您可以使用:

Proc_Close(Proc_Open("phantomjs test.js &", Array (), $foo));

运行您的 phantomjs 脚本(基于 this answer).似乎您只需要图像,因此在这种情况下不需要管道.

完整的参考脚本位于此处,可在 Windows 上按原样运行.

本文地址:https://www.itbaoku.cn/post/1740022.html