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 相关文章推荐
实时抓取YAHOO股票报价的代码
Oct 09 PHP
一个简单的PHP&amp;MYSQL留言板源码
Jul 19 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
功能强大的PHP POST提交数据类
Jul 15 PHP
php中文语义分析实现方法示例
Sep 28 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
php上传文件常见问题总结
2015/02/03 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
jquery获取input的value问题说明
2010/08/19 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
微信运维交互机器人的示例代码
2018/11/12 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
python实现中文转换url编码的方法
2016/06/14 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
python中封包建立过程实例
2021/02/18 Python
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
法雷奥SQA(electric)面试问题
2016/01/23 面试题
写演讲稿要注意的六件事
2014/01/14 职场文书
入股协议书范本
2014/04/14 职场文书
创优争先心得体会
2014/09/11 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
详细总结Python常见的安全问题
2021/05/21 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python
分享几种python 变量合并方法
2022/03/20 Python