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 相关文章推荐
MySQL数据源表结构图示
Jun 05 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
Mar 19 PHP
PHP实现的增强性mhash函数
May 27 PHP
php抓取并保存网站图片的实现代码
Oct 28 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
Jan 05 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
Zend Framework过滤器Zend_Filter用法详解
Dec 09 PHP
PHP实现的文件上传类与用法详解
Jul 05 PHP
基于PHP的登录和注册的功能的实现
Aug 06 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源代码
2006/10/09 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
PHP引用符&amp;的用法详细解析
2013/08/22 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
js中关于String对象的replace使用详解
2011/05/24 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
JavaScript实现关键字高亮功能
2014/11/12 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
在Django的视图(View)外使用Session的方法
2015/07/23 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
python实现列表的排序方法分享
2019/07/01 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
个人承诺书
2014/03/26 职场文书
捐助倡议书范文
2014/04/15 职场文书
实习单位鉴定评语
2014/04/26 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
给校长的建议书500字
2014/05/15 职场文书
社团活动总结格式
2014/08/29 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫