首页 > 语言 > PHP > 正文

PHP实现的CURL非阻塞调用类

2024-05-05 00:04:44
字体:
来源:转载
供稿:网友

本文实例讲述了PHP实现的CURL非阻塞调用类。分享给大家供大家参考,具体如下:

前面一篇《PHP实现非阻塞模式的方》文章讲述了PHP中实现非阻塞模式,其实如果只是HTTP的话,直接用CURL就能实现。

基于网上的一段代码,修改完善后封装了一个支持POST/GET的非阻塞调用类。

欢迎测试bug~~~~~

/***************************************************** CURL 非阻塞调用类 Auther: Linvo Copyright(C) 2010/10/21*******************************************************//*  // 使用范例  // 传入参数说明  // url 请求地址  // data POST方式数据  //并发调用  $param1 = array(      array(        'url' => "http://localhost/a.php?s=1",        ),      array(        'url' => "http://localhost/a.php?s=1",        'data' => array('aaa' => 1, 'bbb' => 2),        ),      );  //单个调用  $param2 = array(      'url' => "http://localhost/a.php?s=0",      'data' => array('aaa' => 1, 'bbb' => 2),      );  //单个调用(GET简便方式)  $param3 = 'http://localhost/a.php?s=2';  $ac = new AsyncCURL();  $ac->set_param($param1);  $ret = $ac->send();  //返回值为请求参数顺序的结果数组(元素值为False表示请求错误)  var_dump($ret);*/class AsyncCURL{  /**   * 是否需要返回HTTP头信息   */  public $curlopt_header = 0;  /**   * 单个CURL调用超时限制   */  public $curlopt_timeout = 20;  private $param = array();  /**   * 构造函数(可直接传入请求参数)   *   * @param array 可选   * @return void   */  public function __construct($param = False)  {    if ($param !== False)    {      $this->param = $this->init_param($param);    }  }  /**   * 设置请求参数   *   * @param array   * @return void   */  public function set_param($param)  {    $this->param = $this->init_param($param);  }  /**   * 发送请求   *   * @return array   */  public function send()  {    if(!is_array($this->param) || !count($this->param))    {      return False;    }    $curl = $ret = array();    $handle = curl_multi_init();    foreach ($this->param as $k => $v)    {      $param = $this->check_param($v);      if (!$param) $curl[$k] = False;      else $curl[$k] = $this->add_handle($handle, $param);    }    $this->exec_handle($handle);    foreach ($this->param as $k => $v)    {      if ($curl[$k])      {        $ret[$k] = curl_multi_getcontent($curl[$k]);        curl_multi_remove_handle($handle, $curl[$k]);      } else {        $ret[$k] = False;      }    }    curl_multi_close($handle);    return $ret;  }  //以下为私有方法  private function init_param($param)  {    $ret = False;    if (isset($param['url']))    {      $ret = array($param);    } else {      $ret = isset($param[0]) ? $param : False;    }    return $ret;  }  private function check_param($param = array())  {    $ret = array();    if (is_string($param))    {      $url = $param;    } else {      extract($param);    }    if (isset($url))    {      $url = trim($url);      $url = stripos($url, 'http://') === 0 ? $url : NULL;    }    if (isset($data) && is_array($data) && !empty($data))    {      $method = 'POST';    } else {      $method = 'GET';      unset($data);    }    if (isset($url)) $ret['url'] = $url;    if (isset($method)) $ret['method'] = $method;    if (isset($data)) $ret['data'] = $data;    $ret = isset($url) ? $ret : False;    return $ret;  }  private function add_handle($handle, $param)  {    $curl = curl_init();    curl_setopt($curl, CURLOPT_URL, $param['url']);    curl_setopt($curl, CURLOPT_HEADER, $this->curlopt_header);    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);    curl_setopt($curl, CURLOPT_TIMEOUT, $this->curlopt_timeout);    if ($param['method'] == 'POST')    {      curl_setopt($curl, CURLOPT_POST, 1);      curl_setopt($curl, CURLOPT_POSTFIELDS, $param['data']);    }    curl_multi_add_handle($handle, $curl);    return $curl;  }  private function exec_handle($handle)  {    $flag = null;    do {      curl_multi_exec($handle, $flag);    } while ($flag > 0);  }}

希望本文所述对大家PHP程序设计有所帮助。


注:相关教程知识阅读请移步到PHP教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选