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 相关文章推荐
php的字符串用法小结
Jun 08 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 PHP
php的urlencode()URL编码函数浅析
Aug 09 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
php使用pdo连接并查询sql数据库的方法
Dec 24 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 PHP
PHP中localeconv()函数的用法
Mar 26 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
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
深入解析php之apc
2013/05/15 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
js切换光标示例代码
2013/10/10 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
javascript几个易错点记录
2014/11/26 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
javascript实时显示当天日期的方法
2015/05/20 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
简述vue中的config配置
2018/01/23 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
python中的常量和变量代码详解
2018/07/25 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
wxPython实现列表增删改查功能
2019/11/19 Python
python中如何使用insert函数
2020/01/09 Python
python实现银行实战系统
2020/02/26 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
2014新课程改革心得体会
2014/03/10 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
Python使用pyecharts控件绘制图表
2022/06/05 Python