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 相关文章推荐
php实现水仙花数的4个示例分享
Apr 08 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
May 06 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
php实现按照权重随机排序数据的方法
Jan 09 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
PHP多线程编程之管道通信实例分析
Mar 07 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 PHP
WordPress中创建用户角色的相关PHP函数使用详解
Dec 25 PHP
php把时间戳转换成多少时间之前函数的实例
Nov 16 PHP
Laravel实现autoload方法详解
May 07 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 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
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
jquery 可排列的表实现代码
2009/11/13 Javascript
JS 显示当前日期与时间的代码
2010/03/24 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
javaScript基础详解
2017/01/19 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
对于Python装饰器使用的一些建议
2015/06/03 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
医药代表个人的求职信分享
2013/12/08 职场文书
秋季红领巾广播稿
2014/01/27 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
心理咨询承诺书
2014/05/20 职场文书
职务任命书范本
2014/06/05 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
个人委托书如何写
2014/09/25 职场文书
处罚决定书范文
2015/06/24 职场文书
运动会广播稿200字
2015/08/19 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
vue选项卡切换的实现案例
2022/04/11 Vue.js
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android