使用CURL使用cronjob进行PHP多处理

时间:2012-06-19 19:49:44

标签: php multithreading curl cron multiprocessing

我需要做的是使用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页面一样... 任何想法!?

3 个答案:

答案 0 :(得分:2)

分成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可以对你的网站做任何事情,所以,而不是调用一个页面,为什么不做页面请求会导致的实际工作?让网络服务器继续成为一个网络服务器,而不是一个臃肿的脚本回购。

答案 1 :(得分:2)

正如@Brad所说,curl-multi-exec应该是一个选项。

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

答案 2 :(得分:1)

你有完整的cron,或者你只能指定php文件吗?

您可以使用xargs使用-P参数

分叉10个进程
seq `1 10`|xargs -n1 -P10 php /path/to/file.php