实现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 相关文章推荐
用PHP制作静态网站的模板框架(四)
Oct 09 PHP
PHP 的 __FILE__ 常量
Jan 15 PHP
php 图片上传类代码
Jul 17 PHP
php中删除、清空session的方式总结
Oct 09 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
详解php中serialize()和unserialize()函数
Jul 08 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 PHP
关于laravel5.5的定时任务详解(demo)
Oct 23 PHP
php字符串倒叙
Apr 01 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
php5新改动之短标记启用方法
2008/09/11 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
thinkPHP5 tablib标签库自定义方法详解
2017/05/10 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
Vue中key的作用示例代码详解
2020/06/10 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
Python单链表简单实现代码
2016/04/27 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
Python分治法定义与应用实例详解
2017/07/28 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
python 为什么说eval要慎用
2019/03/26 Python
python 表格打印代码实例解析
2019/10/12 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
医学生实习自我鉴定
2013/09/27 职场文书
学生实习介绍信
2014/01/15 职场文书
京剧自荐信
2014/01/26 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
工作决心书范文
2014/03/11 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
Pytest中conftest.py的用法
2021/06/27 Python
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL