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中文件上传的安全问题
Oct 09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 PHP
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
PHP实现时间轴函数代码
Oct 08 PHP
gd库图片下载类实现下载网页所有图片的php代码
Aug 20 PHP
php使用curl访问https示例分享
Jan 17 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
Aug 01 PHP
php实现36进制与10进制转换功能示例
Jan 10 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
tp5实现微信小程序多图片上传到服务器功能
Jul 16 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获取图片信息的方法详解
2015/12/10 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
2010/11/25 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
线程和进程的区别及Python代码实例
2015/02/04 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
详解python实现交叉验证法与留出法
2019/07/11 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
利用python爬取有道词典的方法
2020/12/08 Python
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
国贸专业个人求职信范文
2014/01/08 职场文书
服务理念标语
2014/06/18 职场文书
会计试用期自我评价
2014/09/19 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
2014年话务员工作总结
2014/11/19 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫