0

私は毎朝cronを介して実行されるスパイダーを作成しようとしています。レンダリングされたDOM(javascriptの後)を取得するために、ヘッドレスブラウザーを組み込みたいと思いました。

私はCrowbar(ヘッドレスブラウザー)を使用してみましたが、cURLを介して1つ(そして1つだけ)のページを取得することに成功しました。ドキュメントは存在せず、最初のリクエストごとにハングします。

どうすればPHPを介してCrowbarのプロセスを強制終了できますか。本質的には、Crowbarのプロセスを自由に開始/停止できるようにするためです。それとも、これらのヘッドレスブラウザを常に実行したままにしておくのでしょうか。それはリソースの浪費のようです。

これは私が試したコードですが、プロセスを強制終了しても機能しません。

$toExecute = "\"" .ROOT . "/vendors/xulrunner/xulrunner.exe \" \"". ROOT . "/app/Vendor/crowbar/xulapp/application.ini \" 2>&1 &";
$handle = shell_exec($toExecute);

$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, 'http://127.0.0.1:10000/?url=' . $url . '&delay=3000&view=as-is');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec ($curl);

exec("kill -KILL ".$handle); //this does not work...
echo $html;

または、JavaScriptを使用してPHPをスクレイプするためのより良い方法はありますか?聞きたいです...

4

1 に答える 1

1

shell_exec()ハンドルを返しません。コマンドの出力を返します。したがって、にSTDOUTとSTDERRが表示され$handleます。これを停止し、代わりにエコーのみ$!を実行します。これは、最後に実行されたコマンドのPIDとして設定されます。このPIDを渡すとkill、適切に殺すことができますxulrunner.exe

それで、それを要約すると:

$toExecute = "<path>/xulrunner.exe <params> >/dev/null 2>/dev/null & echo $!";
$myPid = shell_exec( $toExecute );

...

exec( "/bin/kill $myPid" );

escapeshellarg()安全のために、必要に応じて使用する必要があることに注意してくださいescapeshellcmd()。そうでなければ、あなたは自分自身をシェナニガンにさらしているのです。

于 2013-03-13T17:42:00.560 に答える