当前位置: 首页 > news >正文

[转]CURL 非阻塞调用类

<?php
/*****************************************************
 * 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);
    }
}

源码转自互联网

相关文章:

  • 如何在VC下配置openGL2
  • 树莓派编译安装FFmpeg(添加H.264硬件编解码器支持)
  • 滑动菜单及滑动解锁技术分析
  • CentOS 67 下安装二进制版FFMPEG
  • 提供一个MTK在LCD上直接输入汉字或其他语言字串的函数
  • CentOS常用仓库
  • MySQL里bool类型字段是否需要添加索引测试
  • 提供一个MTK平台可以使用的DES加密算法
  • Linux磁盘空间不够用怎么办?
  • MTK层的运用
  • 树莓派上运行docker
  • 提供一个简单的滑动菜单的数据结构
  • PHP Ajax动态列表的后退操作——保存列表内容和点击位置
  • 对MTK的层简单封装以方便使用
  • PHP RC4 加解密类
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 30秒的PHP代码片段(1)数组 - Array
  • 30天自制操作系统-2
  • Elasticsearch 参考指南(升级前重新索引)
  • GitUp, 你不可错过的秀外慧中的git工具
  • JAVA SE 6 GC调优笔记
  • JavaScript创建对象的四种方式
  • Java面向对象及其三大特征
  • MaxCompute访问TableStore(OTS) 数据
  • MQ框架的比较
  • Python 反序列化安全问题(二)
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SpriteKit 技巧之添加背景图片
  • TypeScript迭代器
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 半理解系列--Promise的进化史
  • 前端性能优化--懒加载和预加载
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何用vue打造一个移动端音乐播放器
  • 一道闭包题引发的思考
  • 数据可视化之下发图实践
  • 正则表达式-基础知识Review
  • ​io --- 处理流的核心工具​
  • ​如何防止网络攻击?
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (Note)C++中的继承方式
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (排序详解之 堆排序)
  • (转)setTimeout 和 setInterval 的区别
  • .axf 转化 .bin文件 的方法
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务