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 相关文章推荐
自己动手做一个SQL解释器
Oct 09 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
Sep 23 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
smarty实现多级分类的方法
Dec 05 PHP
推荐10个提供免费PHP脚本下载的网站
Dec 31 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
Symfony模板的快捷变量用法实例
Mar 17 PHP
phpcms的分类名称和类别名称的调用
Jan 05 PHP
php smtp实现发送邮件功能
Jun 22 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
php实现将数据做成json的格式给前端使用
Aug 21 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读取IMAP邮件
2006/10/09 PHP
php 数组的一个悲剧?
2011/05/11 PHP
php提示undefined index的几种解决方法
2012/05/21 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
PHP发送短信代码分享
2015/08/11 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
js字符串转成JSON
2013/11/07 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
2014/03/12 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
python 上下文管理器使用方法小结
2017/10/10 Python
python爬取亚马逊书籍信息代码分享
2017/12/09 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
信访工作者先进事迹
2014/01/17 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
上班迟到检讨书300字
2014/10/18 职场文书
西游降魔篇观后感
2015/06/15 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android
Python&Matlab实现樱花的绘制
2022/04/07 Python
TypeScript 内置高级类型编程示例
2022/09/23 Javascript