实现PHP多线程异步请求的3种方法


Posted in PHP onJanuary 17, 2014

在网上看过很多版本的PHP异步请求方法,这里简单总结几个常用方法分享给大家

1、用CURL实现一步请求

CURL扩展是我们在开发过程中最常用的一种方法,他是一个强大的HTTP命令行工具,可以模拟POST/GET等HTTP请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。

示例:

<?php 
$cl = curl_init(); 
$curl_opt = array(CURLOPT_URL, 'http://www.uncletoo.com/demo.php', 
CURLOPT_RETURNTRANSFER, 1, 
CURLOPT_TIMEOUT, 1,); 
curl_setopt_array($cl, $curl_opt); 
curl_exec($ch); 
curl_close($ch); 
?>

由于CUROPT_TIMEOUT属性最小值为1,这就意味着在客户端必须等待1秒,这也是使用CURL方法的缺点

2、用popen()函数实现异步请求

语法格式:popen(command,mode)

示例:

<?php 
$file = popen("/bin/ls","r"); 
//这里是要执行的代码 
//... 
pclose($file); 
?>

popen()函数直接打开一个指向进程的管道,速度快,即时相应。但是这个函数是单项的,要么读要么写,而且如果并发数较大,则会产生大量进程,给服务器造成负担。

另外,如同示例中一样,程序结束后一定要用pclose()来关闭。

3、用fscokopen()函数实现异步请求

我们在平时开发邮件发送功能等socket编程时,都会用到这个函数,在使用这个函数之前,我们要在PHP.ini 中开启 allow_url_fopen 选项,另外在变成时,我们还要自己手动拼接出header部分。

示例:

$fp = fsockopen("www.uncletoo.com/demo.php", 80, $errno, $errstr, 30); 
if (!$fp) { 
echo "$errstr ($errno)<br />\n"; 
} else { 
$out = "GET /index.php / HTTP/1.1\r\n"; 
$out .= "Host: www.uncletoo.com\r\n"; 
$out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); 
/*这里忽略执行结果 
*测试时可以打开 
while (!feof($fp)) { 
echo fgets($fp, 128); 
}*/ 
fclose($fp); 
}

PHP本身没有多线程,但是我们可以用其他方式来实现多线程的效果,上面列举的三种方式都有各自的优缺点,大家在使用时可以根据程序的需要择优选择。

UncleToo经验尚浅,这里就简单总结了这么多,如果有其他更好的实现PHP多线程的方法可以一起讨论!

PHP 相关文章推荐
网络资源
Oct 09 PHP
文件系统基本操作类
Nov 23 PHP
PHP和XSS跨站攻击的防范
Apr 17 PHP
php FPDF类库应用实现代码
Mar 20 PHP
抓取YAHOO股票报价的类
May 15 PHP
PHP文件注释标记及规范小结
Apr 01 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
Sep 22 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
PHP实现的方程求解示例分析
Nov 11 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 PHP
一个PHP二维数组排序的函数分享
Jan 17 #PHP
PHP登陆后跳转到登陆前页面实现思路及代码
Jan 17 #PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 #PHP
php使用curl访问https示例分享
Jan 17 #PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 #PHP
php 检查电子邮件函数(自写)
Jan 16 #PHP
php mail to 配置详解
Jan 16 #PHP
You might like
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
javascript replace()正则替换实现代码
2010/02/26 Javascript
javascript面向对象之共享成员属性与方法及prototype关键字用法
2015/01/13 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
js日期插件dateHelp获取本月、三个月、今年的日期
2016/03/07 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
Python PyQt5整理介绍
2020/04/01 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
大学军训感言300字
2014/03/09 职场文书
活动宣传策划方案
2014/05/23 职场文书
法人授权委托书样本
2014/09/19 职场文书
医学会议开幕词
2016/03/03 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
golang interface判断为空nil的实现代码
2021/04/24 Golang
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL