美文网首页
php使用register_tick_function来定位执行

php使用register_tick_function来定位执行

作者: 黄刚刚 | 来源:发表于2021-12-13 11:02 被阅读0次
    <?php
    
    /**
     * 代码执行时间跟踪器
     */
    class Tracker
    {
    
        /**
         * 记录执行代码次数
         * @var int
         */
        protected $eval_code_line_num = 0;
    
        /**
         * 记录执行代码开始时间(毫秒时间戳)
         * @var int
         */
        protected $eval_code_time = 0;
    
        /**
         * 执行代码过慢时间(单位毫秒)
         * @var int
         */
        protected $slow_code_time = 200;
    
        /**
         * 获取当前时间(毫秒时间戳)
         * millisecondTime
         * @return float|int
         */
        protected function millisecondTime()
        {
            return microtime(true) * 1000;
        }
    
        /**
         * 设置执行代码过慢时间(单位毫秒)
         * @param $time
         * @return Tracker
         * @throws Exception
         */
        public function setSlowCodeTime($time)
        {
            if ($time <= 0) {
                throw new \Exception('执行代码过慢时间必须大于0');
            }
            $this->slow_code_time = $time;
            return $this;
        }
    
        /**
         * startCollect
         * @throws Exception
         */
        public function startCollect()
        {
            declare (ticks=1);
            if (!register_tick_function([$this, 'handle'])) {
                throw new \Exception('注册tracker处理函数失败');
            }
        }
    
        /**
         * handle
         */
        public function handle()
        {
            // 记录执行代码次数+1
            $this->eval_code_line_num++;
            // 获取当前时间(毫秒时间戳)
            $millisecondTime = $this->millisecondTime();
            // 记录执行代码开始时间(毫秒时间戳)
            if (!$this->eval_code_time) {
                $this->eval_code_time = $millisecondTime;
            }
            // 当前时间 - 执行代码开始时间 > 执行代码过慢时间 : 说明执行当前行的代码执行过慢
            if (($millisecondTime - $this->eval_code_time) > $this->slow_code_time) {
                $e = new \Exception();
                $ret = $e->getTrace()[0] ?? [];
                $ret['eval_code_line_num'] = $this->eval_code_line_num;
                var_dump($ret);
                die();
            } else {
                $this->eval_code_time = $millisecondTime;
            }
        }
    }
    
    // 在其他文件中的使用示例 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    /*
    // 引入代码执行时间跟踪器类
    include_once "./Tracker.php";
    // 设置执行指令ticks=1(这个一定不能少)
    declare(ticks=1);
    // 查询执行超过10毫秒的代码位置
    $object = new Tracker();
    $object->setSlowCodeTime(10)->startCollect();
    
    // 写个循环100次
    for ($i = 1;$i <= 100;$i++){
        if($i == 10){
            // 延迟10毫秒(usleep函数的值是微妙,1000微妙=1毫秒)
            usleep(10000);
        }
    }
    */

    相关文章

      网友评论

          本文标题:php使用register_tick_function来定位执行

          本文链接:https://www.haomeiwen.com/subject/rmpefrtx.html