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和XSS跨站攻击的防范
Apr 17 PHP
PHP下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
Ha0k 0.3 PHP 网页木马修改版
Oct 11 PHP
使用VisualStudio开发php的图文设置方法
Aug 21 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
ThinkPHP CURD方法之table方法详解
Jun 18 PHP
Yii支持多域名cors原理的实现
Dec 05 PHP
php时间戳转换代码详解
Aug 04 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
Apr 23 PHP
laravel开发环境homestead搭建过程详解
Jul 03 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
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
Yii中CGridView关联表搜索排序方法实例详解
2014/12/03 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
php实现session共享的实例方法
2019/09/19 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
JQuery 遮罩层实现(mask)实现代码
2010/01/09 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
独特的python循环语句
2016/11/20 Python
基于Python的PIL库学习详解
2019/05/10 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
python多线程http压力测试脚本
2019/06/25 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
工程造价专业大学生自荐信
2013/10/01 职场文书
有个性的自我评价范文
2013/11/15 职场文书
企业总经理岗位职责
2014/02/13 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
火锅店的活动方案
2014/08/15 职场文书
2014年班务工作总结
2014/12/02 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
Python办公自动化之Excel(中)
2021/05/24 Python
索尼ICF-36收音机评测
2022/04/30 无线电