欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP实现的CURL非阻塞调用类

程序员文章站 2022-07-06 10:52:49
本文实例讲述了php实现的curl非阻塞调用类。分享给大家供大家参考,具体如下: 前面一篇《php实现非阻塞模式的方法》文章讲述了php中实现非阻塞模式,其实如果只是ht...

本文实例讲述了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 curl用法总结》、《php网络编程技巧总结》、《php数组(array)操作技巧大全》、《php字符串(string)用法总结》、《php数据结构与算法教程》及《php中json格式数据操作技巧汇总

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