4种PHP异步执行的常用方式


Posted in PHP onDecember 24, 2015

本文为大家讲述了php异步调用方法,分享给大家供大家参考,具体内容如下
客户端与服务器端是通过HTTP协议进行连接通讯,客户端发起请求,服务器端接收到请求后执行处理,并返回处理结果。
有时服务器需要执行很耗时的操作,这个操作的结果并不需要返回给客户端。但因为php是同步执行的,所以客户端需要等待服务处理完才可以进行下一步。
因此对于耗时的操作适合异步执行,服务器接收到请求后,处理完客户端需要的数据就返回,再异步在服务器执行耗时的操作。
1.使用Ajax 与 img 标记
原理,服务器返回的html中插入Ajax 代码或 img 标记,img的src为需要执行的程序。
优点:实现简单,服务端无需执行任何调用
缺点:在执行期间,浏览器会一直处于loading状态,因此这种方法并不算真正的异步调用。

$.get("doRequest.php", { name: "fdipzone"} );
<img src="doRequest.php?name=fdipzone">

2.使用popen
使用popen执行命令,语法:

// popen — 打开进程文件指针  
resource popen ( string $command , string $mode )
pclose(popen('php /home/fdipzone/doRequest.php &', 'r'));

优点:执行速度快
缺点:

  • 1).只能在本机执行
  • 2).不能传递大量参数
  • 3).访问量高时会创建很多进程

3.使用curl
设置curl的超时时间 CURLOPT_TIMEOUT 为1 (最小为1),因此客户端需要等待1秒

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

4.使用fsockopen
fsockopen是最好的,缺点是需要自己拼接header部分。

<?php 
   
$url = 'http://www.example.com/doRequest.php'; 
$param = array( 
  'name'=>'fdipzone', 
  'gender'=>'male', 
  'age'=>30 
); 
   
doRequest($url, $param); 
   
function doRequest($url, $param=array()){ 
   
  $urlinfo = parse_url($url); 
   
  $host = $urlinfo['host']; 
  $path = $urlinfo['path']; 
  $query = isset($param)? http_build_query($param) : ''; 
   
  $port = 80; 
  $errno = 0; 
  $errstr = ''; 
  $timeout = 10; 
   
  $fp = fsockopen($host, $port, $errno, $errstr, $timeout); 
   
  $out = "POST ".$path." HTTP/1.1\r\n"; 
  $out .= "host:".$host."\r\n"; 
  $out .= "content-length:".strlen($query)."\r\n"; 
  $out .= "content-type:application/x-www-form-urlencoded\r\n"; 
  $out .= "connection:close\r\n\r\n"; 
  $out .= $query; 
   
  fputs($fp, $out); 
  fclose($fp); 
} 
   
?>

注意:当执行过程中,客户端连接断开或连接超时,都会有可能造成执行不完整,因此需要加上

ignore_user_abort(true); // 忽略客户端断开 
set_time_limit(0);    // 设置执行不超时

以上就是php异步调用方法的详细介绍,希望对大家的学习有所帮助。

PHP 相关文章推荐
WML,Apache,和 PHP 的介绍
Oct 09 PHP
PHP入门速成教程
Mar 19 PHP
什么是MVC,好东西啊
May 03 PHP
PHP 反向排序和随机排序代码
Jun 30 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
Yii框架登录流程分析
Dec 03 PHP
php使用curl代理实现抓取数据的方法
Feb 03 PHP
PHP实现添加购物车功能
Mar 06 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
Laravel路由研究之domain解决多域名问题的方法示例
Apr 04 PHP
php实现异步数据调用的方法
Dec 24 #PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 #PHP
深入浅析php json 格式控制
Dec 24 #PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
Dec 24 #PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 #PHP
php采用session实现防止页面重复刷新
Dec 24 #PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 #PHP
You might like
php递归遍历多维数组的方法
2015/04/18 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
JavaScript动态提示输入框输入字数的方法
2015/07/27 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
Python不规范的日期字符串处理类
2014/06/10 Python
用python实现对比两张图片的不同
2018/02/05 Python
Python requests库用法实例详解
2018/08/14 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
python re模块常见用法例举
2021/03/01 Python
机械设计制造专业个人求职信
2013/09/25 职场文书
婚礼秀策划方案
2014/05/19 职场文书
车间安全生产标语
2014/06/06 职场文书
初中同学会活动方案
2014/08/22 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
大学生学期个人总结
2015/02/12 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
2016党校培训心得体会
2016/01/07 职场文书
Redis性能监控的实现
2021/07/09 Redis
Python安装使用Scrapy框架
2022/04/12 Python