美文网首页
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来定位执行

  • FFMpeg for PHP

    FFMpeg for PHP PHP使用FFMpeg来转换视频格式。 本质是使用ffmpeg服务来执行的,而非通过...

  • centos 下使用执行php文件

    找到php的可执行文件 把它复制到 /usr/local/bin 下面,然后就可以直接使用php来执行了

  • PHP扩展开发

    为什么要用到php扩展?因为php扩展使用C语言编写,而C语言是静待编译的,所以执行效率要高于php很多,这里我来...

  • PHP连接MySql闪断自动重连的方法

    使用php作为后台运行程序(例如短信群发),在cli模式下执行php,php需要连接mysql循环执行数据库处理。...

  • mac上crontab定时任务php artisan命令

    在MAC上使用crontab定时任务执行php artisan命令时,需要注意:必须使用完整的php二进制执行路径...

  • PHP的底层原理

    PHP文件的执行过程 先从一个简单的php文件开始,通过php文件的编译过程来引入php的底层 执行结果如下: 编...

  • 如何编写PHP拓展

    为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多。同样的运算代码,使用C来开发,性能会比PHP要提升数...

  • PHP定时脚本

    PHP的定时脚本其实就是使用crontab定时命令来执行PHPcrontab -e:打开定时脚本文件,编辑定时脚本...

  • PHP exec()函数执行系统命令失败

    0.说明 在php中,我们可以使用exec()来执行系统命令,但有时我们会遇到exec()命令执行不成功,或者无返...

网友评论

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

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