PHP 异步执行方法,模拟多线程的应用分析


Posted in PHP onJune 03, 2013

PHP 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式。
另外还有一种更简单的方式可用于 Web 程序中,那就是用 fsockopen()、fputs() 来请求一个 URL, 而无需等待返回,如果你在那个被请求的页面(URL)中做些事情就相当于异步了。
关键代码如下:

<?php
  $fp = fsockopen('localhost',80,&$errno,&$errstr,5);  
  if(!$fp)
     {
         echo "$errstr ($errno)<br />/n"; 
     }
     fputs($fp,"GET another_page.php?flag=1/r/n"); 
     fclose($fp);

上面的代码向页面 another_page.php 发送完请求就不管了,用不着等待请求页面的响应数据,利用这一点就可以在被请求的页面 another_page.php 中异步的做些事情了。
比如,一个很切实的应用,我们每当发表了一篇新日志后需要给所有该日志的订阅者发个邮件通知, 如果按照通常的方式就是:
日志写完 -> 点提交按钮 -> 日志插入到数据库 -> 发送邮件通知 -> 告知撰写者发布成功
那么作者在点提交按钮到看到成功提示之间可能会等待很常时间,基本是在等邮件发送的过程,比如连接邮件服务异常、或器缓慢或是订阅者太多。而实际上是不管邮件发送成功与否,保证日志保存成功基本可接受的,所以等待邮件发送的过程是很不经济的,这个过程可异步来执行,并且邮件发送的结果不太关心或以日志形式记录备查。
改进后的流程就是:
日志写完 -> 点提交按钮 -> 日志插入到数据库 ---> 告知撰写者发布成功
                                                           └ 发送邮件通知 -> [记下日志]
写个实际的程序来测试一下,有两个文件,分别是 write.php 和 sendmail.php,在 sendmail.php 用 sleep(seconds) 来模拟程序执行所使用时间。
write.php,执行耗时 1 秒:
 <?php  
  function asyn_sendmail() 
     { 
         $fp = fsockopen('localhost',80,&$errno,&$errstr,5);  
      if(!$fp)
         {
            echo "$errstr ($errno)<br />/n";
         } 
     sleep(1); 
     fputs($fp,"GET /sendmail.php?param=1/r/n"); #请求的资源 URL 一定要写对 
     fclose($fp); 
    }  
 echo time().'<br>'; 
 echo 'call asyn_sendmail<br>'; 
 asyn_sendmail(); 
 echo time().'<br>';

sendmail.php,执行耗时 10 秒:
<?php 
sleep(10); 
fopen("C:/" . time(),  "w"); 

通过页面访问 write.php,页面输出:
1272472697
call asyn_sendmail
1272472698
并且在 C:/ 生成文件:
1272472708
从上面的结果可以看出 sendmail.php 至少花费 10 秒,但不会阻塞 write.php 继续往下执行,表明这一过程是异步的。
PHP 相关文章推荐
Apache+php+mysql在windows下的安装与配置图解(最新版)
Nov 30 PHP
php_xmlhttp 乱码问题解决方法
Aug 07 PHP
php 分页原理详解
Aug 21 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 PHP
php+ajax无刷新分页实例详解
Dec 07 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
thinkphp分页实现效果
Oct 13 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
详解PHP素材图片上传、下载功能
Apr 12 PHP
基于PHP异步执行的常用方式详解
Jun 03 #PHP
php生成二维码的几种方式整理及使用实例
Jun 03 #PHP
深入PHP异步执行的详解
Jun 03 #PHP
php实现自动获取生成文章主题关键词功能的深入分析
Jun 03 #PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 #PHP
PHP Error与Logging函数的深入理解
Jun 03 #PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 #PHP
You might like
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
几个php应用技巧
2008/03/27 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
javascript面向对象之二 命名空间
2011/02/08 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
React实践之Tree组件的使用方法
2017/09/30 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
微信小程序实现两个页面传值的方法分析
2018/12/11 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
Python Pandas 箱线图的实现
2019/07/23 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
AJax面试题
2014/11/25 面试题
数控专业应届生求职信
2013/11/27 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
社区服务活动小结
2014/07/08 职场文书
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS