微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP 异步执行方法,模拟多线程的应用分析

PHP 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式。
另外还有一种更简单的方式可用于 Web 程序中,那就是用 fsockopen()、fputs() 来请求一个 URL,而无需等待返回,如果你在那个被请求的页面(URL)中做些事情就相当于异步了。

关键代码如下:

<div class="codetitle"><a style="CURSOR: pointer" data="61664" class="copybut" id="copybut61664" onclick="doCopy('code61664')"> 代码如下:
<div class="codebody" id="code61664">
<?PHP
$fp = fsockopen('localhost',80,&$errno,&$errstr,5);
if(!$fp)
{
echo "$errstr ($errno)
/n";
}
fputs($fp,"GET another_page.PHP?flag=1/r/n");
fclose($fp);

上面的代码页面 another_page.PHP 发送完请求就不管了,用不着等待请求页面的响应数据,利用这一点就可以在被请求的页面 another_page.PHP 中异步的做些事情了。
比如,一个很切实的应用,我们每当发表了一篇新日志后需要给所有该日志的订阅者发个邮件通知,如果按

照通常的方式就是:

<FONT style="COLOR: #ff0000">日志写完 -> 点提交按钮 -> 日志插入到数据库 -> 发送邮件通知 -> 告知撰写者发布成功
那么作者在点提交按钮到看到成功提示之间可能会等待很常时间,基本是在等邮件发送的过程,比如连接邮件服务异常、或器缓慢或是订阅者太多。而实际上是不管邮件发送成功与否,保证日志保存成功基本可接受的,所以等待邮件发送的过程是很不经济的,这个过程可异步来执行,并且邮件发送的结果不太关心或以日志形式记录备查。

改进后的流程就是:

<FONT style="COLOR: #ff0000">日志写完 -> 点提交按钮 -> 日志插入到数据库 ---> 告知撰写者发布成功
发送邮件通知 -> [记下日志]
写个实际的程序来测试一下,有两个文件,分别是 write.PHP 和 sendmail.PHP,在 sendmail.PHP 用 sleep(seconds) 来模拟程序执行所使用时间。

write.PHP,执行耗时 1 秒:

<div class="codetitle"><a style="CURSOR: pointer" data="53379" class="copybut" id="copybut53379" onclick="doCopy('code53379')"> 代码如下:
<div class="codebody" id="code53379">
<?PHP
function asyn_sendmail()
{
$fp = fsockopen('localhost',5);
if(!$fp)
{
echo "$errstr ($errno)
/n";
}
sleep(1);
fputs($fp,"GET /sendmail.PHP?param=1/r/n"); #请求的资源 URL 一定要写对
fclose($fp);
}
echo time().'
';
echo 'call asyn_sendmail
';
asyn_sendmail();
echo time().'
';

sendmail.PHP,执行耗时 10 秒:

<div class="codetitle"><a style="CURSOR: pointer" data="31352" class="copybut" id="copybut31352" onclick="doCopy('code31352')"> 代码如下:
<div class="codebody" id="code31352">
<?PHP
sleep(10);
fopen("C:/" . time(),"w");

通过页面访问 write.PHP页面输出

1272472697
call asyn_sendmail
1272472698
并且在 C:/ 生成文件
1272472708
从上面的结果可以看出 sendmail.PHP 至少花费 10 秒,但不会阻塞 write.PHP 继续往下执行,表明这一过程是异步的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

多线程多线程异步

相关推荐