设为首页 收藏本站
查看: 771|回复: 0

[经验分享] 如何实现php异步处理

[复制链接]

尚未签到

发表于 2017-12-29 20:35:40 | 显示全部楼层 |阅读模式
  在实际生成环境下,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的异步。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429495-1-1.html 上篇帖子: php实现https(tls/ssl)双向认证 下篇帖子: PHP中获取某个月份的天数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表