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 相关文章推荐
PHP3 safe_mode 失效漏洞
Oct 09 PHP
PHP has encountered an Access Violation
Jan 15 PHP
php is_file()和is_dir()用于遍历目录时用法注意事项
Mar 02 PHP
PHP中Session引起的脚本阻塞问题解决办法
Apr 08 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Oct 20 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
php计算整个mysql数据库大小的方法
Jun 19 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
PHP邮箱验证示例教程
Jun 01 PHP
Yii实现Command任务处理的方法详解
Jul 14 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 PHP
PHP中str_split()函数的用法讲解
Apr 11 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 adodb连接不同数据库
2009/03/19 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
探讨如何把session存入数据库
2013/06/07 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
jquery select选中的一个小问题
2009/10/11 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
简化版的vue-router实现思路详解
2018/10/19 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
python安装以及IDE的配置教程
2015/04/29 Python
Python实例一个类背后发生了什么
2016/02/09 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
python文件编写好后如何实践
2020/07/07 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
电子专业推荐信范文
2013/11/18 职场文书
销售部主管岗位职责
2013/12/18 职场文书
先进个人获奖感言
2014/01/24 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android
MySQL分布式恢复进阶
2022/07/23 MySQL