• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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)  !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程序设计有所帮助。

    您可能感兴趣的文章:
    • php 多进程编程父进程的阻塞与非阻塞实例分析
    • 简单介绍PHP非阻塞模式
    • PHP实现非阻塞模式的方法分析
    • php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
    • 关于PHP中协程和阻塞的一些理解与思考
    • PHP编程中的Session阻塞问题与解决方法分析
    • php基于session锁防止阻塞请求的方法分析
    • 深入解析PHP中的(伪)多线程与多进程
    • 深入探究PHP的多进程编程方法
    • php多进程中的阻塞与非阻塞操作实例分析
    上一篇:PHP等比例压缩图片的实例代码
    下一篇:Ubuntu彻底删除PHP7.0的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PHP实现的CURL非阻塞调用类 PHP,实现,的,CURL,非,阻塞,