一个php请求怎样才算结束?

     前边文章说过: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脚本:

      

       原本我认为:当执行完第二句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输出缓存后:就大大减少了服务器上的线程数量堆积!!

 

     其实这种办法并没有让用户更快的受到数据,亦即:对用户本身而言没有任何优化;但是对服务器却是很大的优化,因其加快了每个请求的处理速度,避免了线程堆积导致的问题!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值