加入收藏 | 设为首页 | 会员中心 | 我要投稿 菏泽站长网 (https://www.0530zz.cn/)- 数据工坊、负载均衡、数据快递、云计算、事件网格!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP实现的CURL非阻塞调用类

发布时间:2022-06-20 09:10:21 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了PHP实现的CURL非阻塞调用类,结合实例形式分析了php使用curl实现的非阻塞调用类具体定义与使用技巧,需要的朋友可以参考下。 本文实例讲述了PHP实现的CURL非阻塞调用类,分享给大家供大家参考,具体如下: 前面一篇《PHP实现非阻塞模式的方
  这篇文章主要介绍了PHP实现的CURL非阻塞调用类,结合实例形式分析了php使用curl实现的非阻塞调用类具体定义与使用技巧,需要的朋友可以参考下。
 
  本文实例讲述了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) && !emptyempty($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);
    }
  }
 

(编辑:菏泽站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读