同事在优化页面加载慢的问题中将数据分离为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 echo similar_text("Hello World","Hello Shanghai"); ?> 2.计算两个字符串的相似度,并返回百分比 <?php similar_text("...
<?php //高先生简单验证码. //随机数 //为什么循环0-15的数字 //因为要实现最简单的字母和数字混搭 //16进制0-9 a-f //dechex 十进制转换为16进制 //创建一个四位的验证码. //$nmsg.  ...
【一】.抽象类假设如下场景:团队准备开发某网站,表建好了,页面设计好了.A组负责开发底层数据库操作类(DB),B组负责调用DB类.但是此时A组发生了争执,MySQL? Oracle? DB2? sqlite?到底使用什么数据库?B组.... 进入漫长的等待.解决方法:A组和B组 先定1个数据库类的模...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...
xmlrpc协议是通过http请求xml数据进行通信。webservice中和它相同的是soap。soap调用的确很简单,但是创建wsdl太繁琐,效率低下。xmlrpc很好的解决这个问题。(1).创建xmlrpc服务端(求和函数api)function getSum($method,$ar...
众所周知MyISAM引擎不支持事务,但是我只是知道不支持事务,并未测试具体的表现是什么,测试代码如下:try { //开启事务 Db::startTrans(); &...