PHP保持请求直到完成

时间:2015-08-21 12:26:22

标签: php http curl

我有一个用PHP编写的API,它使用CURL发送10个请求。 问题是,当我向API发送HTTP请求时,我立即得到响应,尽管服务器还没有完成工作(获得所有10个请求的响应)。

我无法使用ignore_user_abort(),因为我需要确切知道API完成的时间。

如何通知连接"嘿,等待脚本完成工作"?

重要提示:如果我使用sleep()连接,则

这是我的代码:gist

2 个答案:

答案 0 :(得分:0)

这只是一个展示ob_start如何工作的例子。

 echo "hello";
 ob_start();    // output buffering starts here
 echo "hello1";
 //all curl requests
 if(all curl requests completed)
 {
    ob_end_flush() ;
 }

没有代码可以引用,我只能显示ob_start的实现。您必须根据您的要求更改此代码。

$handlers = [];
$mh = curl_multi_init();
ob_start();   // output buffering starts here
foreach($query->fetchAll() as $domain){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://'.$domain['name']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $DEFAULT_REQUEST_TIMEOUT);
curl_setopt($ch, CURLOPT_TIMEOUT, $DEFAULT_REQUEST_TIMEOUT);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
curl_multi_add_handle($mh, $ch);
$handlers[] = ['ch'=>$ch, 'domain_id'=>$domain['domain_id']];
echo $domain['name'];
}

// Execute the handles
$active = null;
do {
  $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
   // Wait for activity on any curl-connection
   if (curl_multi_select($mh) == -1) {
    usleep(1);
}

   // Continue to exec until curl is ready to
   // give us more data
   do {
      $mrc = curl_multi_exec($mh, $active);
   } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}

// Extract the content
$values = [];
foreach($handlers as $key => $handle){
// Check for errors
echo $key.'. result: ';
$curlError = curl_error($handle['ch']);
if($curlError == ""){
    $res = curl_multi_getcontent($handle['ch']);
    echo 'done';
}
else {
    echo "Curl error on handle $key: $curlError".' <br />';
}

  // Remove and close the handle
  curl_multi_remove_handle($mh, $handle['ch']);
  curl_close($handle['ch']);
}
// Clean up the curl_multi handle
curl_multi_close($mh);
ob_end_flush() ; // output flushed here

来源 - http://php.net/manual/en/function.ob-start.php

答案 1 :(得分:0)

我在我的网站上使用此代码

 ob_start("unique_identifier"); 

// your header script
// your page script
// your footer script

 ob_end_flush("unique_identifier");
 ob_end_clean("unique_identifier");

我使用“ unique_identifier”,因为我的脚本中还存在另一个 ob_start()