php异步执行方法,仿真多线程应用分析
PHP本身没有很多线程,但它可以通过曲线创建相同的效果,如多进程方式来实现异步调用,这仅限于命令模式。此外,有一个Web程序更简单的方法,即通过fsockopen请求的URL(),作用是:将内容(),无需等待返回,如果你请求的页面做某事(URL),它相当于异步。
关键代码如下所示:
复制代码代码如下所示:
< PHP
FP = fsockopen('localhost美元,80美元美元,errno,errstr,5);
如果(!$ FP)
{
回声errstr美元(约合errno) / ;
}
作用是:将内容($ FP,让another_page。phpflag = 1 / R / );
Fclose($ FP);
上面的代码不关心发送请求的页面another_page.php,所以不需要等待页面的请求的响应数据,所以我们可以在请求的页面another_page.php异步地做某事。
例如,一个非常实用的应用程序,每当我们发布一个新的日志时,我们需要发送一个电子邮件通知给所有日志的订阅者,如果用通常的方式:
单击提交按钮,将log - >日志完成到数据库中,发送电子邮件通知通知作者> >发布成功
作者可能会等待很长时间的时候,他点提交按钮即可看到成功的提示,这基本上是在等待邮件发送的过程,如连接邮件服务例外,慢或太多的用户。但实际上是否成功保证邮件日志成功基本上可以接受的,所以等待电子邮件是不经济的,这个过程可以异步执行,和邮件的结果不关心或日志记录表。
改进的过程是:
日志完成>点击提交按钮>登录到数据库中告知他的写作,发布成功
发送电子邮件通知{注意} -日志
写测试实用程序,里面有两个文件,即write.php和sendmail.php,睡觉(秒)是用来模拟在sendmail.php程序的执行时间。
write.php,执行时间是1秒:
复制代码代码如下所示:
< PHP
asyn_sendmail()函数
{
FP = fsockopen('localhost美元,80美元美元,errno,errstr,5);
如果(!$ FP)
{
回声errstr美元(约合errno) / ;
}
睡眠(1);
作用是:将内容($ FP,拿 /邮件发送。phpparam = 1 / R / N );URL #资源请求必须写上
Fclose($ FP);
}
回声(时间);
echo'call asyn_sendmail;
asyn_sendmail();
回声(时间);
sendmail.php,执行需要10秒:
复制代码代码如下所示:
< PHP
睡眠(10);
Fopen(C: / 。时间(),W;
write.php通过访问页面,页面输出:
十二亿七千二百四十七万二千六百九十七
电话asyn_sendmail
十二亿七千二百四十七万二千六百九十八
该文件是用C生成的:
十二亿七千二百四十七万二千七百零八
它可以从sendmail.php至少需要10秒以上的结果看,但不写块。PHP的继续执行,表明该过程是异步的。