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 相关文章推荐
Excel数据导入Mysql数据库的实现代码
Jun 05 PHP
php 更新数据库中断的解决方法
Jun 05 PHP
PHP 数据结构 算法 三元组 Triplet
Jul 02 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
Oct 29 PHP
php修改指定文件后缀的方法
Sep 11 PHP
PHP中imagick函数的中文解释
Jan 21 PHP
PHP 验证登陆类分享
Mar 13 PHP
php使用正则表达式进行字符串搜索的方法
Mar 23 PHP
php读取txt文件并将数据插入到数据库
Feb 23 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
Laravel手动分页实现方法详解
Oct 09 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/03/10 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python实现按长宽比缩放图片
2018/06/07 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
使用Python 统计高频字数的方法
2019/01/31 Python
python使用KNN算法识别手写数字
2019/04/25 Python
python求绝对值的三种方法小结
2019/12/04 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
住房公积金接收函
2014/01/09 职场文书
给老师的检讨书
2014/02/11 职场文书
求职意向书范文
2014/04/01 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
初中班级口号
2014/06/09 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
解除劳动合同协议书范本2014
2014/09/25 职场文书
迎新年主持词
2015/07/06 职场文书
2019年教师入党申请书
2019/06/27 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers