Php 使程序同步打开

Php 使程序同步打开,php,proc-open,Php,Proc Open,我有一个PHP脚本,它依赖于shell_exec,因此99%的时间都能正常工作。该脚本执行一个PhantomJS脚本,该脚本生成一个图像文件。然后使用更多的PHP以某种方式处理该图像文件。问题是有时shell_exec会挂起并导致可用性问题。读了这篇文章,我了解到问题出在shell_exec上,切换到proc_open可以解决挂起问题 问题是,当shell_exec等待执行的命令完成proc_open时,没有打开,因此跟随它并处理生成的映像的PHP命令失败,因为映像仍在生成中。我在Windows

我有一个PHP脚本,它依赖于shell_exec,因此99%的时间都能正常工作。该脚本执行一个PhantomJS脚本,该脚本生成一个图像文件。然后使用更多的PHP以某种方式处理该图像文件。问题是有时shell_exec会挂起并导致可用性问题。读了这篇文章,我了解到问题出在shell_exec上,切换到proc_open可以解决挂起问题

问题是,当shell_exec等待执行的命令完成proc_open时,没有打开,因此跟随它并处理生成的映像的PHP命令失败,因为映像仍在生成中。我在Windows上工作,所以pcntl_waitpid不是一个选项

我最初的方法是尝试让PhantomJS连续输出一些东西,让proc_打开阅读。你可以看到我在这个线程中尝试了什么:

我无法让这个工作,似乎没有其他人有一个解决方案给我。 所以我现在要问的是如何让proc_open像shell_exec一样同步工作。我需要脚本中剩余的PHP命令仅在proc_open命令结束后执行

根据第一个注释请求添加我的代码:

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

如果我使用cmd.exe ping表单exmaple而不是c:\phantomjs\phantomjs.exe/test.js,我会打印一行又一行的$return\u消息,因此我知道proc\u open接收到一个流。我正试图在幻影脚本中实现同样的效果。

添加一些代码来告诉我们您在那里做了什么,怎么样?从您的代码中,我不认为php是问题所在,而是您的js代码,它不会阻塞,并且很可能脚本在处理回调之前完成执行。可能会在page.open调用之后阻塞,并在调用完成后释放。twisted您可以在js代码中更具体地说明阻塞。我不是一个大的js专家,当然可以使用更多的指导!谢谢这是我在nodejs的一个很小的经验,我不知道它在这里适用。您的page.open调用基本上会在后台发送回调,直到它完成,但脚本处理不会在该调用时停止,因为它是在后台发送的,并且将继续,而不会向您抛出任何信息。也许可以做一些类似的事情:var isDone=0;第页,打开'http://www.cnn.com,函数{page.render'test.png';isDone=1;};setIntervalfunction{ifisDone{phantom.exit;}},200
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();
});