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程序设计有所帮助。
上一篇: js 将canvas生成图片保存,或直接保存一张图片的实现方法
下一篇: php工具型代码之印章抠图