私は 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
。私は何を間違っていますか?