使Proc_Open同步工作

时间:2014-08-01 10:52:44

标签: php proc-open

我有一个依赖于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读取。你可以看到我在这个帖子中尝试了什么:

Get PHP proc_open() to read a PhantomJS stream for as long as png is created

我无法让这个工作,似乎没有其他人有我的解决方案。 所以我现在要问的是如何让proc_open像shell_exec一样同步工作。我需要在proc_open命令结束后才能执行脚本中剩余的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();
  }
}

这是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();
});

如果不是&#34; c:\ phantomjs \ phantomjs.exe /test.js"我使用cmd.exe ping表格exmaple我得到一行一行$ return_message打印,所以我知道proc_open收到一个流。我试图通过Phantom脚本来实现同样的目标。

0 个答案:

没有答案