教程集 www.jiaochengji.com
教程集 >  脚本编程  >  php  >  正文 php模拟多线程 异步执行的实例分享

php模拟多线程 异步执行的实例分享

发布时间:2016-09-24   编辑:jiaochengji.com
本文介绍下,在php中通过模拟多线程,进行异步执行代码的例子,有需要的朋友参考下。

在php编程中,有一种简单的方式可用于 Web 程序,即使用 fsockopen()、fputs() 来请求一个 URL, 而无需等待返回,然后在被请求的url中执行相关操作,即可看作异步执行的动作。

以下为关键代码:

复制代码 代码示例:
<?php
/**
* 模拟多线程 异步执行
* edit by www.jbxue.com
*/
$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) 来模拟程序执行所使用时间。

1,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(); //www.jbxue.com
 echo time().'<br>';
 ?>

2,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 异步请求文件实现多线程的代码
php模拟多线程 异步执行的实例分享
php 伪异步执行实现方法
PHP异步调用socket与php异步执行实例
PHP异步调用实现方式详解
PHP多线程异步请求的3种实现方法
php不支持多线程怎么办
PHP异步执行技巧分享
php模拟多线程的实例分享

关键词: php异步请求  异步执行   
[关闭]
~ ~