如何通过cron作业运行(并杀死)headless browser以在PHP中实现自动抓取

如何通过cron作业运行(并杀死)headless browser以在PHP中实现自动抓取,php,web-scraping,headless-browser,Php,Web Scraping,Headless Browser,我一直在尝试创建一个每天早上通过cron运行的spider。我想合并一个无头浏览器,以获得呈现的DOM(在javascript之后) 我尝试使用(无头浏览器),并成功地通过cURL获得了一个(而且只有一个)页面。文档不存在,并且在每次请求后都会挂起 我如何通过PHP杀死Crowbar的进程,本质上是为了能够随意启动/停止它。或者人们只是让这些无头浏览器持续运行?这似乎是资源的流失 这是我尝试过的代码,但扼杀进程不起作用 $toExecute = "\"" .ROOT . "/vendors/xu

我一直在尝试创建一个每天早上通过cron运行的spider。我想合并一个无头浏览器,以获得呈现的DOM(在javascript之后)

我尝试使用(无头浏览器),并成功地通过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中进行刮取?我很想听听……

shell\u 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" );
$toExecute=“/xulrunner.exe>/dev/null 2>/dev/null&echo$!”;
$myPid=shell_exec($toExecute);
...
exec(“/bin/kill$myPid”);

请注意,为了安全起见,您应该在适当的地方使用
escapeshellarg()
escapeshellcmd()
。否则,您将面临恶作剧。

PHP中的curl句柄与可杀死的进程完全无关。curl将完全在php内部运行。没有外部进程可以终止。我不是在尝试“终止一个cURL进程”-我是在尝试终止crowbar(该进程从上述代码的第2行开始)。如果您使用
proc_open()
,您可以稍后调用
posix_kill()
我在windows上运行
proc_open()
时遇到问题。在
popen()
(xulrunner.exe)中运行良好的命令找不到要在
proc\u open()
中运行的application.ini文件,尽管使用了绝对路径…我在windows环境(Apache)中,尽管这是朝着正确方向迈出的一步,我无法使用shell_exec在后台运行进程,也无法回显进程id。(我已经尽了一切努力让进程在后台运行,但在windows上,这是一场噩梦)对于后代,我相信Aleksi的信息是正确的,但为了抓取,我最终从撬棍变成了幻影。PhantomJS是一个简单的include,通过在脚本末尾调用
phantom.exit()
,可以很容易地从内部停止,这完全解决了我的问题。