1

私は PHP スクリプトに依存してshell_exec()おり、(結果として) 99% の確率で動作しました。このスクリプトは、画像ファイルを生成する PhantomJS スクリプトを実行しました。次に、さらに PHP を使用して、その画像ファイルを特定の方法で処理しました。問題は、ときどきshell_exec()ハングしてユーザビリティの問題を引き起こすことでした。このhttps://github.com/ariya/phantomjs/issues/11463 を読む と、それshell_exec()が問題であり、に切り替えるとproc_openハングが解決することがわかりました。

問題は、whileshell_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 が生成されますが、単一の .png が取得されません$return_message。私は何を間違っていますか?

4

1 に答える 1

1

リンクされた github の問題でBill Shander が提案したように、以下を使用できます。

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

phantomjs スクリプトを実行するには (この回答に基づいています)。画像だけが必要なようですので、この場合パイプは必要ありません。

参照用の完全なスクリプトはここにあり、Windows でそのまま動作します。

于 2014-08-01T16:08:49.683 に答える