同事在优化页面加载慢的问题中将数据分离为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慢日志即可快速定位。
上家公司开发医院挂号系统,系统采用GBK编码。ajax发送的中文用户名让PHP保存为cookie出现乱码的解决方案。1.Javascript变量var user=document.getElementById('user').innerText; user=escape(u...
原理:使用curl_init()创建多个请求实例,再使用curl_multi_init()批量执行创建的多个请求实例。文件1:curl.php<?php $threads=500;//并发请求次数 $url='http://blog.cn/index.php?';...
md5/sha1+salt方式是目前各大cms常用的加密方式,虽然salt安全,但是各大md5网站也在研究这个方向,那么我们应该选择password_hash动态hash来助力,一种密码有多种hash结果.看代码模拟登陆.<?php //01.注册 $user ='zhang...
xmlrpc协议是通过http请求xml数据进行通信。webservice中和它相同的是soap。soap调用的确很简单,但是创建wsdl太繁琐,效率低下。xmlrpc很好的解决这个问题。(1).创建xmlrpc服务端(求和函数api)function getSum($method,$ar...
php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){ //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...
posix_ttyname - 获取当前终端设备名称。<?php var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...