我一直在尝试创建一个每天早上通过cron运行的蜘蛛。我想合并一个无头浏览器,以便获得渲染的DOM (javascript之后)。
我尝试使用Crowbar(一种无头浏览器),并成功地通过cURL获得一个(而且只有一个)页面。文档是不存在的,并且在每个第一个请求之后都会挂起。
我如何通过PHP杀死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;
或者有一个更好的方法刮在php与javascript?
shell_exec()
没有返回句柄。它返回命令的输出。因此,您将在$handle
中看到STDOUT和STDERR。我将停止此操作,而只回显$!
,它将被设置为最后执行命令的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()
。否则,你就是在让自己暴露在恶作剧中。