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 相关文章推荐
smarty实例教程
Nov 19 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
wamp下修改mysql访问密码的解决方法
May 07 PHP
PHP设计模式之调解者模式的深入解析
Jun 13 PHP
php使用Imagick生成图片的方法
Jul 31 PHP
双冒号 ::在PHP中的使用情况
Nov 05 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
Apr 15 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 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
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
PHP STRING 陷阱原理说明
2010/07/24 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
JS实现DOM删除节点操作示例
2018/04/04 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
win7安装python生成随机数代码分享
2013/12/27 Python
python中logging库的使用总结
2017/10/18 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
python中dict()的高级用法实现
2019/11/13 Python
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
俄罗斯第一家多品牌在线奢侈品精品店:Aizel.ru
2020/09/06 全球购物
护理工作感言
2014/01/16 职场文书
幼儿园评语大全
2014/04/17 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
个人总结格式范文
2015/03/09 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
上手简单,功能强大的Python爬虫框架——feapder
2021/04/27 Python
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
Java使用jmeter进行压力测试
2021/07/09 Java/Android
Java面试题冲刺第十九天--数据库(4)
2021/08/07 Java/Android