同事在优化页面加载慢的问题中将数据分离为2个接口来分别异步加载,但是实际的情况是接口1一直在查询,接口2也一直在查询,接口2一定要等接口1查询完成才能返回结果。一直以为fast-cgi进程数问题,反复设置无效,通过getmypid就能看到每次相应的进程id不同。正好我有空就想到通过register_tick_function来判断到底是卡在哪一行,一旦注册register_tick_function,php执行一行代码都会调用注册的处理函数,通过计算上一次代码执行时间和本次执行时间即可定位位置。
<?php
/**
* Class Tracker
*/
class Tracker
{
/**
* 执行代码时间(单位毫秒)
* @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;
}
/**
* setSlowCodeTime
* @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'], true)) {
throw new \Exception('注册tracker处理函数失败');
}
}
/**
* handle
*/
public function handle()
{
$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();
var_dump($e->getTrace());die();
} else {
$this->eval_code_time = $millisecondTime;
}
}
}
//查询执行超过1秒的代码位置
$object = new Tracker();
$object->setSlowCodeTime(1)->startCollect();
sleep(1);最终定位到的问题是同事本机开发环境session是保存在文件中的,存在session锁的问题,上面的简单粘贴下代码。
可能存在的问题,如果代码执行直接卡死进程关闭是无法定位到的,由于是windows,否则可以开启fpm慢日志即可快速定位。
php官方的超全局变量$_SERVER['PHP_SELF']也能直接获取,只不过如果url参数太多也会获取。下面提供一个方法获取/* * 获取当前PHP文件名称 */ if (!function_exists('phpself...
ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...
(1).在PHP中可以查看的环境变量包括: (1.1).电脑环境变量 (2.1).服务器环境变量(2).getenv()函数获取一个环境变量的值.参数1是环境变量的key,参数2值为true的时候仅从你的电脑环境变量中查找,参数2值为false会从两种变量中全部查询//获取我电脑登录的用户名,输出A...
(1)swoole启动的主进程是master进程负责全局管理,然后master进程会再fork一个manager进程。(2)manager进程开始统一管理进程创建回收管理。(3)manager进程根据设置的worker_num和task_worker_num来创建work进程和task进程因此启动s...
php7新增的特性(1).强制限制只能返回一种类型<?php class task { } //must return an integer function add(): int { &nb...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...