PHP 异步执行方法,模拟多线程的应用分析
2015-01-24信息快讯网
本篇文章是对PHP 异步执行方法,模拟多线程的应用进行了详细的分析介绍,需要的朋友参考下
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中使用redis
6种php上传图片重命名的方法实例
php preg_replace替换实例讲解
php define的第二个参数使用方法
Linux编译升级php的详细方法
PHP设置一边执行一边输出结果的代码
显示程序执行时间php函数代码
PHP-Fcgi下PHP的执行时间设置方法
如何利用PHP执行.SQL文件
php记录代码执行时间(实现代码)
php调用MySQL存储过程的方法集合(推荐)
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
深入php-fpm的两种进程管理模式详解
基于PHP异步执行的常用方式详解
php生成二维码的几种方式整理及使用实例
深入PHP异步执行的详解
php实现自动获取生成文章主题关键词功能的深入分析
PHP Error与Logging函数的深入理解
PHP程序级守护进程的实现与优化的使用概述
记录mysql性能查询过程的使用方法
PHP执行批量mysql语句的解决方法
关于PHP实现异步操作的研究
PHP调用Linux的命令行执行文件压缩命令
PHP得到mssql的存储过程的输出参数功能实现
Linux下实现PHP多进程的方法分享
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
PHP异步调用socket实现代码
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)