本文实例讲述了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 非阻塞post请求,PHP实现的CURL非阻塞调用类相关推荐

  1. java如何阻塞和同步_同步与异步,阻塞与非阻塞

    今天早上关注了这个问题,刚抽出时间大概整理下,以下仅是个人理解: 一定要多看几遍代码并结合文字理解下 引0.从I/O说起 这些概念之所以容易令人迷惑,在于很多人对I/O就没有清晰准确的理解,后面的理解 ...

  2. 非阻塞式编程 php,简单介绍PHP非阻塞模式

    非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态. 让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断 ...

  3. recvfrom函数 非阻塞_那些年让你迷惑的阻塞、非阻塞、异步、同步

    那些年让你迷惑的阻塞.非阻塞.异步.同步 在IT圈混饭吃,不管你用什么编程语言.从事前端还是后端,阻塞.非阻塞.异步.同步这些概念,都需要清晰地掌握,否则,怎么与面试官谈笑风生(chui niu pi ...

  4. java 阻塞与非阻塞_简述JAVA同步、异步、阻塞和非阻塞之间的区别

    同步和异步,阻塞和非阻塞是大家经常会听到的概念,但是它们是从不同维度来描述一件事情,常常很容易混为一谈. 1. 同步和异步 同步和异步描述的是消息通信的机制. 同步 当一个request发送出去以后, ...

  5. Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合

    上文描述了最简易的非阻塞IO,采用的是轮询的方式,这节我们使用IO复用模型. 阻塞IO 过去我们使用IO复用与阻塞IO结合的时候,IO复用模型起到的作用是并发监听多个fd. 以简单的回射服务器为例,我 ...

  6. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞

    一.状态介绍 在了解其他概念之前,我们首先要了解进程的几个状态.在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞. 就绪(Ready)状态:当进程已分配到除CPU ...

  7. linux c fifo阻塞写和非阻塞写,linux—FIFO的使用与非阻塞标志(O_NONBLOCK)的影响

    FIFO文 #include #include int mkfifo( const char*pathname, mode_t mode); 参数: pathname:FIFO的路径名+文件名. mo ...

  8. PHP curl非阻塞代码详解

    在项目同步微信素材库时发现请求等待时间很长,排查之后发现是crul的问题,php中curl是阻塞的,从而导致时间过长,针对这个问题对代码进行了优化,代码如下: // PHP代码 function Po ...

  9. java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...

    内部类(Inner Class)和静态内部类(Static Nested Class)的区别: 定义在一个类内部的类叫内部类,包含内部类的类称为外部类.内部类可以声明public.protected. ...

最新文章

  1. 【Indiegogo众筹】$99高性价比RK3399超小型mini主机
  2. php提供的用户密码加密函数
  3. 曈曈妈妈设计的2010年台历模板
  4. 【数理逻辑】谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 )
  5. RSA加密的填充模式
  6. SSH Secure Shell显示GCC编译错误信息乱码解决方法
  7. python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条
  8. mysql 备份成文件的脚本_Mysql自动全量备份脚本
  9. 31销售是让用户用到货真价实的产品
  10. 红皮书--调试及修复
  11. java 链表实现堆栈_用JAVA实现堆栈(链表篇)
  12. 架构实战篇:使用MyBatis延迟加载模式为数据库减压,附演示实例
  13. # 安卓手机启动黑阈服务
  14. Google技巧:crack web sites
  15. 软件测试工程师工作总结
  16. [NOIP2013 提高组] 火柴排队
  17. 用来做重试的库Tenacity
  18. Unity的一些特效和粒子特效插件
  19. linux防文件误删
  20. Oracle中的日期时间函数

热门文章

  1. Executor 执行器接口笔记
  2. 【Python】find()函数居然还能指定搜索的起点和终点?
  3. [云炬创业学笔记]第一章创业是什么测试16
  4. [云炬创业基础笔记]第四章测试18
  5. 专栏 | 基于 Jupyter 的特征工程手册:数据预处理(二)
  6. VTK修炼之道22:图像基本操作_彩色图像成分提取
  7. Qt修炼手册2_动态设计
  8. Asp.net大文件下载
  9. BUUCTF-WEB:[极客大挑战 2019]EasySQL 1(收藏了URL编码表)
  10. 将某内存单元数据做乘法 + 内存间数据的复制