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
加强版phplib的DB类
Mar 31 PHP
php array_flip() 删除数组重复元素
Jan 14 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
PHP实现上传文件并存进数据库的方法
Jul 16 PHP
php使用gzip压缩传输js和css文件的方法
Jul 29 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
详解如何实现Laravel的服务容器的方法示例
Apr 15 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
PHP7 参数处理机制修改
Mar 09 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
教你如何把一篇文章按要求分段
2006/10/09 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
js parseInt(&quot;08&quot;)未指定进位制问题
2010/06/19 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
github配置使用指南
2014/11/18 Python
python操作excel的方法
2018/08/16 Python
详解python使用turtle库来画一朵花
2019/03/21 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python多线程实现TCP服务端
2019/09/03 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
用python对oracle进行简单性能测试
2020/12/05 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
企业办公室岗位职责
2014/03/12 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
利用Python+OpenCV三步去除水印
2021/05/28 Python
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python