2012-06-19 19 views
1

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

+0

http://php.net/manual/en/function.curl-multi-exec.php – Brad

回答

2

正如@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 
+0

我会试试看,谢谢代码。 –

+0

当我在自己的服务器上请求文件时,它仍然一次调用第1页... –

+0

您给出的路径是什么?如果您提供完整的URL,http://localhost/path/to/script.php,它将如何知道这是否是同一台服务器?此外,测试方法是通过在process_a.php顶部打印以毫秒为单位的时间,然后您可以检查页面是否一次调用一次。 –

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

+0

pcntl_fork默认情况下不可用。你觉得值得安装吗?如果我有7个不同的文件,我想每次打电话10次,这会工作吗? –

+0

我正在使用CURL,因为处理逻辑可能在某个点上位于不同的服务器上。 –

+0

我有_never_看到一个服务器,它具有cronjobs,但没有'pcntl_fork'的能力。如果你需要单独安装,是的,我会说这是值得的。如果你需要10×7个不同的文件,当然,这也可以工作(但是,分叉70次)。 – Wrikken

1

您是否拥有完整的cron,或者您只能指定php文件?

您可能能够使用xargs的叉10点的过程与-P参数

seq `1 10`|xargs -n1 -P10 php /path/to/file.php 
+0

这是什么意思/做什么? 你是说我应该把这个,而不是调用我的cronjob.php?我需要运行cronjob.php来决定此时应处理的请求。 –