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 中文乱码解决办法总结分析
Jul 30 PHP
php mssql扩展SQL查询中文字段名解决方法
Oct 15 PHP
使用HMAC-SHA1签名方法详解
Jun 26 PHP
提高PHP编程效率的方法
Nov 07 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
PHP中配置IIS7实现基本身份验证的方法
Sep 24 PHP
PHP中each与list用法分析
Jan 08 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 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
CI框架Session.php源码分析
2014/11/03 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
Jquery中dialog属性小记
2010/09/03 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
Vue实现todolist删除功能
2018/06/26 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
深入浅析angular和vue还有jquery的区别
2018/08/13 jQuery
js中Generator函数的深入讲解
2019/04/07 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
Python同时向控制台和文件输出日志logging的方法
2015/05/26 Python
Python通过正则表达式选取callback的方法
2015/07/18 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
python 深度学习中的4种激活函数
2020/09/18 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
什么样的创业计划书可行性高?
2014/02/01 职场文书
蛋糕店创业计划书范文
2014/09/21 职场文书
个人四风对照检查材料
2014/09/26 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
技术员岗位职责
2015/02/04 职场文书
教学督导岗位职责
2015/04/10 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL