PHP执行耗时优化

一、耗时纪录方式

在函数执行前后分别调用 microtime() 函数获取当前时间,相减后为本次执行时间。当然也可以使用封装好的计时器函数,但本质还是 microtime()

二、耗时优化方法

1、合理使用 fastcgi_finish_request() 函数

根据 PHP 手册的说明:此函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行。

也就是说,执行该函数后,客户端就会收到本次请求的结果,但是服务端会继续执行本次请求剩余的逻辑。这时即使执行一些耗时操作,客户端也不会有任何感知,达到了提高响应速度的目的。

实际中接触到了下面几种应用场景:

  • “预读”下次请求数据
    根据业务逻辑,判断用户下一次最可能进行的请求(如流程下一步等)。先调用 fastcgi_finish_request() 返回数据,然后读取下一步的数据并存入 Redis 中,下次请求直接从 Redis 中获取结果。局限是仅适用于数据不易变化的场景。如帖子下一页内容会频繁变动,就不适用于此方法。

  • 检查执行错误并记录日志
    Yii 框架中可以在 onEndRequest 回调中使用 error_get_last() 检查错误、记录日志等,如果每次日志量较多,可能会拖慢响应速度。所以可以在程序入口中(如 main.php 配置文件)加入下面代码:

if (Yii::app() instanceof CConsoleApplication) {
} else {
    // 使onEndRequest中的耗时操作在客户端结束连接后执行
    // 这段代码必须放在所有 onEndRequest 事件监听器的最前面
    Yii::app()->attachEventHandler('onEndRequest', function ($event) {
   
        @ob_end_flush();
        if (!function_exists("fastcgi_finish_request")) { // 兼容非CGI方式调用
            function fastcgi_finish_request()
            {
   
            }
        }
        fastcgi_finish_request();
    });
    Yii::app()->attachEventHandler('onEndRequest', function ($event) {
   
        // 收集日志等耗时操作
        // 由于前一段代码已经将数据返回,此处逻辑不会增加响应时间
    });
}

2、使用合理的 Redis 数据类型

一些常见场景需要两张表关联查询,例如先从一张表中查出某分类下的项目,再从另一张表中查出这些项目的数据。但这种场景下一般不使用 JOIN,而是分别进行查询并对结果进行缓存,此时为 Redis 选择合适的数据结构很重要。

这种场景有两种缓存方式:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值