
离线 TA的专栏
- 打卡等级:热心大叔
- 打卡总天数:220
- 打卡月天数:0
- 打卡总奖励:3305
- 最近打卡:2025-06-25 18:55:13
|
本文实例讲述了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程序设计有所帮助。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|