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

[经验分享] 一个php请求怎样才算结束?

[复制链接]
发表于 2017-3-29 13:53:16 | 显示全部楼层 |阅读模式
  前边文章说过:web-server会创建一个线程(进程)来处理收到的php请求。(使用线程还是进程的区别见博文:http://blog.csdn.net/NRC_DouNingBo/archive/2011/06/29/6575807.aspx)。那这个请求怎样才算处理完毕呢?怎样才能让web-server回收这个线程呢??
  user进行一次web请求,其是要请求数据的。所以:一些一个php脚本最后肯定是需要echo一些数据来返回给请求它的user的(这里的user指的是浏览器)。网上也有很多文章在讨论说:echo速度慢,其实这是没有正明白:怎样才算一个php请求的完整过程的缘故。
  比如我写如下php脚本:
  <?php$var['key'] = "temp";echo json_encode($var);?>
  原本我认为:当执行完第二句echo之后这个请求就算执行完了,然后就该web-server回收这个线程了。问题是:这个时候真的执行完了吗?没有!
  ①对于echo,var_dump()等而言:其实要把数据返回给user(浏览器)的。echo的执行过程为:其会把数据发送给user,user收到数据并反馈回来告知:我已经收到了。echo函数收到这个成功信号之后:其才会认为:自己使命结束了,这个函数才算执行完毕。
  因为有上述这么个过程,会导致大量问题,比如:如果user的网络不好,那这个等待发送成功信号的过程会很慢,严重影响这个php脚本的执行速度,争议延长其执行时间,同时导致这个请求的执行线程一直无法回收。 那拿到具体项目上来说:几百万个请求同时请求一个相同的服务器,由于每个的执行时间都过程,这导致大量处理线程无法及时回收,导致服务器端积攒了大量线程。这回严重影响服务器的响应!!
  那怎样解决这些问题呢?要解决这个问题就要从产生这个问题的根源上着手。根源就在于如上所说的:echo本身执行较慢以及php处理线程未释放。
  ①为了处理echo较慢的问题,我们可以打开php的输出缓存。亦即:每次echo返回给用户的数据我们直接让php将之存入php输出缓存中并给出成功应答,这时echo函数会认为其已经达到user端并成功了,从而执行完毕。
  用这种办法解决了echo处理慢的问题;但是echo执行完后php处理线程并未释放,为什么呢?因为此时php的输出缓存中还有刚刚存入的数据没有发送出去,此时php线程当然不能释放。所以他还得等自己输出缓存中的数据都发送出去了才能释放线程。从这一点上来说:使用之中方法后:线程存在的时间根本就没有减少,只是把原本echo消耗的时间转义到了输出缓存上而已。 同时php缓存有大小限制,若echo的数据比这个限制要大,则根本无法存到输出缓存中。
  ②最终极的解决办法是:我们打开apache的输出缓存。这样执行echo时:直接把数据发送到apache的输出缓存中并返回成功信号。echo函数收到信号就认为是成功执行了所以就执行完毕。此时php线程发现自己:整个脚本都执行完毕了,也没有输出缓存要去发送,自己的所有工作都做完了,于是乎就释放自己本身了。
  用这种办法:会真正减少一个php处理进程的执行时间,让这个线程尽快释放,从而减少服务器上的线程数量堆积!! 其本质是:把处理时间由php转给了apache! 但是这样好处是显而易见的:无论是apache还是php线程去处理这个,都是要消耗同样的时间等资源。但是用php还要额外多了线程消耗。开启了apache输出缓存后:就大大减少了服务器上的线程数量堆积!!
  其实这种办法并没有让用户更快的受到数据,亦即:对用户本身而言没有任何优化;但是对服务器却是很大的优化,因其加快了每个请求的处理速度,避免了线程堆积导致的问题!!!

运维网声明 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-357178-1-1.html 上篇帖子: WordPress 主题教程 #3:开始 Index.php 下篇帖子: php 实例说明 socket通信机制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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