使用CURL与cronjob进行PHP多处理
我需要做的是使用PHP处理数据库中未决的多个请求。使用CURL与cronjob进行PHP多处理
我目前想要做的是: 当我的cronjob运行。我想立即调用一个文件“process_a.php”10次,而不用等待它完成处理(process_a.php可能需要几分钟)。
我试图用CURL来做到这一点。但是,当我的cronjob调用process_a.php时,它会等待它完成处理并在调用另一个process_a.php文件之前返回。
我甚至试着把process_a.php中的代码立即关闭连接,然后在后台继续处理。但cronjob仍然等待它完成。
我只想同时执行10次相同的文件,如果有10个不同的用户请求我的网站的index.php页面... 任何想法!?
正如@Brad卷曲多高管告诉应该是一种选择。
http://php.net/manual/en/function.curl-multi-exec.php
<?php
//create the multiple cURL handle
$mh = curl_multi_init();
// create both cURL resources
for($i = 0; $i < 10;$i++){
$ch[$i] = curl_init();
curl_setopt($ch[$i], CURLOPT_URL, "http://urhost//path/to/process_a.php");
curl_setopt($ch[$i], CURLOPT_HEADER, 0);
curl_multi_add_handle($mh,$ch[$i]);//add the handles
}
$active = null;
//execute the handles
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
//close the handles
for($i = 0; $i < 10;$i++){
curl_multi_remove_handle($mh, $ch[$i]);
}
curl_multi_close($mh);
?>
我通过调用下面的另一个脚本测试这个脚本:
<?php
print microtime();//Return current Unix timestamp with microseconds
print '<br>';
?>
和这里的结果,每个处理由执行时间微秒不同。
0.27085300 1340214659
0.44853600 1340214659
0.46611800 1340214659
0.48201000 1340214659
0.50209400 1340214659
0.48233900 1340214659
0.52274300 1340214659
0.54757800 1340214659
0.57316900 1340214659
0.59475800 1340214659
我会试试看,谢谢代码。 –
当我在自己的服务器上请求文件时,它仍然一次调用第1页... –
您给出的路径是什么?如果您提供完整的URL,http://localhost/path/to/script.php,它将如何知道这是否是同一台服务器?此外,测试方法是通过在process_a.php顶部打印以毫秒为单位的时间,然后您可以检查页面是否一次调用一次。 –
叉到10的过程:
<?php
for($i = 0; $i < 10;$i++){
$pid = pcntl_fork():
if ($pid == -1) {
trigger_error('could not fork');
} else if (!$pid) {
//we are the child now
require 'process_a.php';
} else {
// we are the parent, you could do something here if need be.
}
}
...但process_a.php可以做任何你的网站呢,所以,而不是调用一个网页,为什么不这样做实际的工作会导致页面请求在?让Web服务器继续成为一个Web服务器,而不是一个臃肿的脚本回购。
pcntl_fork默认情况下不可用。你觉得值得安装吗?如果我有7个不同的文件,我想每次打电话10次,这会工作吗? –
我正在使用CURL,因为处理逻辑可能在某个点上位于不同的服务器上。 –
我有_never_看到一个服务器,它具有cronjobs,但没有'pcntl_fork'的能力。如果你需要单独安装,是的,我会说这是值得的。如果你需要10×7个不同的文件,当然,这也可以工作(但是,分叉70次)。 – Wrikken
您是否拥有完整的cron,或者您只能指定php文件?
您可能能够使用xargs的叉10点的过程与-P
参数
seq `1 10`|xargs -n1 -P10 php /path/to/file.php
这是什么意思/做什么? 你是说我应该把这个,而不是调用我的cronjob.php?我需要运行cronjob.php来决定此时应处理的请求。 –
http://php.net/manual/en/function.curl-multi-exec.php – Brad