2013-05-15 90 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