zoukankan      html  css  js  c++  java
  • 使用fastcgi_finish_request提高页面响应速度

    当PHP运行在FastCGI模式时,PHP FPM提供了一个名为fastcgi_finish_request的方法.按照文档上的说法,此方法可以提高请求的处理速度,如果有些处理可以在页面生成完后再进行,就可以使用这个方法.

    听起来可能有些茫然,我们通过几个例子来说明一下:

    <?php
     
    echo '例子:';
    fastcgi_finish_request(); /* 响应完成, 关闭连接 */
     
    /* 记录日志 */
    file_put_contents('log.txt', '生存还是毁灭,这是个问题.');
    ?>

    通过浏览器访问此脚本, 结果发现并没有输出相应的字符串,但却生成了相应的文件.由此说明在调用fastcgi_finish_request后,客户端响应就已经结束,但与此同时服务端脚本却继续运行!

    合理利用这个特性可以大大提升用户体验,趁热打铁再来一个例子:

    <?php
     
    echo '例子:';
     
    file_put_contents('log.txt', date('Y-m-d H:i:s') . " 上传视频
    ", FILE_APPEND);
     
    fastcgi_finish_request();
     
    sleep(1);
    file_put_contents('log.txt', date('Y-m-d H:i:s') . " 转换格式
    ", FILE_APPEND);
     
    sleep(1);
    file_put_contents('log.txt', date('Y-m-d H:i:s') . " 提取图片
    ", FILE_APPEND);
     
    ?>

    代码里用sleep模拟一些耗时的操作,浏览时没有被堵塞,程序却都执行了,具体看日志.

    末了给您提个醒,Yahoo在Best Practices for Speeding Up Your Web Site中提到了Flush the Buffer Early,也就是利用PHP中的flush方法把内容尽快发到客户端去,它和本文介绍的fastcgi_finish_request有些许的类似.

    转载附言: 我看了下这个方法, 在调用的时候, 会发送响应, 关闭连接. 但是不会结束PHP的运行. 相比调用flush, 或者我之前介绍的加速你的Echo来说, 这个方法能更加干脆一些.

    另外, 从代码的可移植性讲的话, 可以在代码中附上如下代码:

    if (!function_exists("fastcgi_finish_request")) {
          function fastcgi_finish_request()  {
          }
    }

    不会造成代码部署在非fpm环境下造成问题.

  • 相关阅读:
    Angular Universal 学习笔记
    SAP Spartacus 如何获得当前渲染页面的 CMS 元数据
    Angular 服务器端渲染的学习笔记(二)
    Angular 服务器端渲染的学习笔记(一)
    第三方外部 Saas提供商如何跟使用 SAP 系统的客户进行对接接口集成
    如何从 SAP Spartacus Product Detail 页面,找到其 Angular 实现 Component 的位置
    具备自动刷新功能的 SAP ABAP ALV 报表
    C++学习目录
    c--条件编译
    c--文件读写--二进制
  • 原文地址:https://www.cnblogs.com/chunguang/p/5717410.html
Copyright © 2011-2022 走看看