2013-05-15 88 views
0

我想讓PHP請求GET異步,但我的PHP版本是5.2.13,curl的版本是7.16.4,有很多限制。如何使PHP請求GET異步

我想:

curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_TIMEOUT, 1); 

但它不工作。據我所知,這只是從PHP 5.2.3工作

所以我讀了其他解決方案的fsockopen:

function curl_request_async($url, $params, $type='POST') 
    { 
     if (count($params)>0){ 
      $post_params = array(); 

      foreach ($params as $key => &$val) { 
      if (is_array($val)) $val = implode(',', $val); 
      $post_params[] = $key.'='.urlencode($val); 
      } 
      $post_string = implode('&', $post_params); 
     } 

     $parts = parse_url($url); 

     $fp = fsockopen($parts['host'], 
      isset($parts['port'])?$parts['port']:80, 
      $errno, $errstr, 30); 

     // Data goes in the path for a GET request 
     if(('GET' == $type)&& isset($post_string)) $parts['path'] .= '?'.$post_string; 

     $out = "$type ".$parts['path']." HTTP/1.1\r\n"; 
     $out.= "Host: ".$parts['host']."\r\n"; 
     $out.= "Content-Type: application/x-www-form-urlencoded\r\n"; 
     $out.= "Content-Length: ".strlen($post_string)."\r\n"; 
     $out.= "Connection: Close\r\n\r\n"; 
     // Data goes in the request body for a POST request 
     if ('POST' == $type && isset($post_string)) $out.= $post_string; 

     fwrite($fp, $out); 
     fclose($fp); 
    } 

與POST的作品,但不以找到工作。我想讓請求GET異步

任何人都可以幫助我嗎?

非常感謝你

+0

這是如何異步? –

+0

什麼是不工作,你能澄清你的問題是什麼? –

+0

這不是異步的。您應該使用另一個php腳本文件(或.sh或其他)的外部調用(exec)。把它放在後臺並用文件管理輸出。一切都取決於你爲什麼要這個調用異步。 –

回答

0

爲什麼你想讓網絡請求異步響應? HTTP請求旨在被同步響應。

我會建議,如果你想從前端解耦後端長時間運行的請求/進程,所以響應更加快速,將使用背景PHP工作者,通過rabbitMQ或beanstalkd,並有在後臺運行你長時間運行的進程。您的HTTP請求只會返回一個作業ID,您可以使用該ID作爲另一個調用來檢查長時間運行的作業的狀態。此外,作業完成後,您可以撥打電話以通知呼叫者該作業已完成,因此可以繼續執行其他觸發或編程流程。

+0

「GET」對不起,我的意思是我想把請求GET背景(我不想等待來自請求GET的響應並繼續執行其餘的PHP)。我沒有在服務器上使用PHP CLI,所以我不能使exec 1成爲另一個php文件 – ducib