2011-11-06 59 views
8

我需要一个PHP cURL配置,以便我的脚本能够发送请求并忽略由API发送的答案。PHP cURL只需要发送而不是等待响应

curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_POST,count($fields)); 
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string); 
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
//curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100); 
$result = curl_exec($ch); 
echo $result; 
curl_close ($ch); 

我尝试添加: // curl_setopt($ CH,CURLOPT_RETURNTRANSFER,FALSE); // curl_setopt($ ch,CURLOPT_TIMEOUT_MS,100);

但它不能正常工作,并且API Web服务器没有收到请求。

原因是我向API发送了大量的请求,因此我的脚本非常慢,因为它等待着每一个请求。

任何帮助表示赞赏。

回答

6

`

public function cccc($test=1) { 
if($test==1) { 
    $url = 'http://examplesite.com/test/cccc/2'; 
    $curl = curl_init();     
    $post['test'] = 'test'; 
    curl_setopt($curl, CURLOPT_URL, $url); 
    curl_setopt ($curl, CURLOPT_POST, TRUE); 
    curl_setopt ($curl, CURLOPT_POSTFIELDS, $post); 

    curl_setopt($curl, CURLOPT_USERAGENT, 'api'); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_HEADER, 0); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($curl, CURLOPT_FORBID_REUSE, true); 
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 1); 
    curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, 10); 

    curl_setopt($curl, CURLOPT_FRESH_CONNECT, true); 

    $data = curl_exec($curl); 
    echo $data; 


    curl_close($curl); 
} else { 
    ob_end_clean(); 
    header("Connection: close\r\n"); 
    header("Content-Encoding: none\r\n"); 
    header("Content-Length: 1"); 
    ignore_user_abort(true); 

    sleep(10); 
    $this->db->query('UPDATE new_hook_memory SET new=new+1 WHERE id=1');  

    }} 

//测试

`

+20

不要在代码中添加任何代码?这没用。 –

+1

真棒,它的工作原理,谢谢! –

+0

这有效,但如果你设置的超时时间太短(在我的情况下为10毫秒),它会在请求完全发送前中断。 –

0

如何判断请求是否成功?您需要至少等待来自服务器的状态码来确定。如果延迟是问题,请查看curl multi API并行执行多个请求。一旦状态码已被返回,您应该能够设置写入回调函数以中止接收返回的数据。

3

如果可能的话,你可以在后台运行wget(使用exec

+0

这不能解决问题。 这相当于背景卷曲,并且仍然会有一个等待响应的进程,消耗计算资源。 – Bladt

2

有点晚了,但现在要解决这个为任何有兴趣的人都需要将CURLOPT_RETURNTRANSFER设置为TRUE,而不是false。这样curl_exec函数立即返回一个值,而不是在返回之前等待请求完成 - 即它是异步的而不是同步的。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
+2

Reza问别的东西 – popas

+2

为什么这个答案仍然有2分? –

+0

将CURLOPT_RETURNTRANSFER设置为true可确保我立即得到返回值,而不必等待请求完成。这不是OP要求的吗? – ljelewis