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

如何实现php异步处理

 

在实际生成环境下,PHP作为后台的接口服务器已经很常见,PHP当然具有它能作为后台服务器的优势之处,但是,在处理一些客户端并不关心的结果时,就显出它的弊端了---没有异步执行的机制。就比如我们想做一些对于某次客户端访问PHP性能记录(包括开始时间、结束时间、此次结果状态等)的纪录时,客户端当然想的是PHP的本次处理能够早点回复,拿到结果,而如果安装常规的方案,客户端就得等PHP做完性能记录之后,才能拿到结果。相当于你去银行去查你现在的余额,而柜员跑过去跟其他人闹了一会儿的磕,在来告诉你的结果一样。

所以,很多时候,就需要一种PHP能执行异步操作。

那怎么才能实现异步呢?

其中一种方案就是利用PHP的系统调用,开启新的进程来实现。

PHP 提供了fsockopen函数,此函数功能为初始化一个套接字连接到指定主机,认情况下将以阻塞模式开启套接字连接。当然你可以通过stream_set_blocking()将它转换到非阻塞模式。这是关键。所以,思路就是:开启一个非阻塞的套接字连接到本机,本机收到之后作一些耗时处理。

类似这样的处理代码文件posttest.PHP):

$fp = fsockopen($PHP_Path,80);
if (!$fp) {
LMLog::error("fsockopen:err" );
} else {
$out = "GET /album/action/album_write_friends_thread_record.PHP?key=&u= HTTP/1.1\r\n";
$out .= "Host: ".$PHP_Path."\r\n";
$out .= "Connection: Close\r\n\r\n";
stream_set_blocking($fp,true);
stream_set_timeout($fp,1);
fwrite($fp, $out);
usleep(1000);
fclose($fp);
}

这里,usleep(1000) 非常关键,它能保证这个请求能发出去。

我们在来看处理的代码逻辑(文件album_write_friends_thread_record.PHP):

<?PHP
/**
* Created by PHPStorm.
* User: Administrator
* Date: 2016-09-23
* Time: 09:26
*/
/**
* 客户端调用服务器接口页面
* user: guwen
*/
sleep(20);// 睡眠20s
?>
实际上,我们服务器在执行fsockopen 那段程序时,就不会再等20s之后才能返回给客户端,而是发出这个请求之后,即返回客户端,销毁进程,而把剩余的工作交由其他进程慢慢做去,这就实现了PHP的异步。
转载自:https://www.cnblogs.com/JDtech/p/6418438.html

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

相关推荐