0

我一直在尝试创建一个每天早上通过 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;

或者有没有更好的方法用 javascript 在 php 中抓取?我很想听听...

4

1 回答 1

1

shell_exec()不返回句柄。它返回命令的输出。因此,您会在$handle. 我将停止此操作,而仅$!将 echo 设置为最后执行命令的 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 回答