江湖恩仇录之PHP程序CPU高占用优化经历分享

故事原由

本故事根据真实故事书写,若有雷同绝非巧合。在开发过程当中不免反复修改程序,面对忽然起来的问题不免一筹莫展,有些人选择自我处理问题,也有人选择交流区域咨询,或许恰巧有人有相似的问题,恰好能够解决你的问题,可是若是你的问题刚好有些独特,最后仍是须要本身谷歌百度,大海捞针似的搜寻。
一套几年前的程序,如今急需大范围使用起来,优化了一些细节,因为业务的转型,全线使用php快速解决方案,因而乎就没有测试其余问题匆忙上线了。php

初入江湖下山历练

去年上线,上线确定难以免不少细节问题,优化优化,最大的优化就是布局模式增长,常见的企业网站布局方式不免那么几种,因而在总结常见状况的基础下开始了布局设计。大体分析为以下草图。
layout
首页布局模式比起以前的要多一些,所有模块容器是自适应的,无内容的状况下自动收缩。left与right默认状况下保留一种,按钮提示网站编辑人员自动激活。html

无统一心法几乎走火入魔

开发过程当中必需要有一套统一的规范,但经常有这样的状况,第一规范运行后有一批产出的时候,优化细节后又上了第二规范,初入江湖的时候已是正式大范围使用的第三次规范了,也就是说以前有异议。这个只是说在使用过程当中若是碰见以前版本的,从新按照新的规范优化上线,对于没有使用到的暂时就保持原型。mysql

平静中暗藏杀机

渐渐的布局的问题趋于平静,伴随着这种平静迎来的一个新的难题,服务器CPU飙高,卡死。
这个是我今天主要分享的故事,公司因为自身条件的问题,一直使用的windows+iis+mysql+php(asp),在win上使用iis运行php,使用过这样生产环境的应该知道上面的各类问题,可是实际问题仍是实际问题,改变不了只能按照这种环境来作适应。其余问题暂且不描述了,说来就话长了。
除了服务器的缘由,确定的仍是程序有问题了。linux

潜心修炼 问题分析

  1. 首页布局复杂化加载引发?
    访问模式与编辑模式同时操做首页,首页也是动态读取,解决方案就是静态化首页,服务器环境设置文档类型优先级index.html高于index.php,这样一来就须要第一次自动生成,后续主动生成。这个过程也伴随着不少问题,编辑时本身遗忘了生成,产生出的问题就是我添加了资料为什么界面没有任何变化?这个只是一个习惯问题,渐渐的就行了,可是问题仍是存在,只是感受好了一些许。
  2. 首页布局程序优化?
    大部分时间是在操做资料添加,首页布局拖动,首页布局拖动保存的时候页面会刷新一次,加载一次页面自己占用很高的CPU,开发环境下连续屡次刷新的后果就是卡死,还不用说服务器环境下。因而想到的是把布局拖动完成后的那一次刷新给取消掉,经过ajax的方式插入内容,可是实际的开发过程当中因为程序自己的问题,修改了一些程序,眼看着就能成功的时候碰见了一些小问题,数据不能与结构关联起来,正准备深刻研究怎么解决的时候,找寻了一些程序分析优化工具,前面的工做就放弃了,开始给程序作一个总体的诊断。
  3. 工具的选择
    以前尚未这么细致的优化过程序,彻底不知道如何开始下手。在 @luofei614 的建议下推荐我试试xdebug,xhprof,使用就是oneApm,其中oneApm简单不少,搜索了一下发现是蓝海讯通的项目,这里好像有一个认识的人 @互联网fans ,他们的态度的确不错,只是我只是抱着试试的心态注册使用了,非常挺不错的,可是只有linux的,在win上的方案没有,下了key下来也没有使用,次日客服居然经过我留下的电话联系了我,咨询相关状况,还好没有留下企业名称要不就暴露了。态度不错,可是确定是有缘由的…
    无奈下一个工具,以前其实就了解过这些工具,可是一直没有落实过使用方法,此次是被逼无奈的。尝试了使用xedebug,安装过程什么都仍是比较愉快,可是就是扩展始终加载不起。在官网文档上找到了问题的缘由:git

    Xdebug does not work together with the Zend Optimizer or any other extension that deals with PHP's internals (DBG, APD, ioncube etc). This is due to compatibility problems with those modules.github

    因为zend的缘由暂时就放弃了xdebug,转为尝试xhprof,这时又发现了一个新的问题,在windows上xhprof的php的版本是5.3+,生产环境的php的版本是5.2.17,按理说应该能够编译一个适合5.2的xhprof,不会这个也就无奈了。本地开发中我切换到了5.3,愉快的运行了,替换掉了核心加密文件,分析过程也就即将开始了。
  4. 正式开始检查优化工做
    一个好的工具每每是解决问题的关键方案,知道根本缘由,而后对症下药。安装好了xhprof,检测了一下程序如今的运行状况
    问题未解决
    问题未解决
    从图中能够看出大量文件操做致使CPU占用极高,找到问题就是接下来优化问题,程序中有使用一个mysql_fetch_object(),表面看是没有什么问题的,php官网文档,中描述的是接收一个资源结果集做为参数。可是程序中这里使用了多个参数,搜索了一下找不到答案,有几个简单的描述,可是仍是不能理解,还但愿熟悉的指教一下,谢谢。我暂时直接取消后两个参数,相应的首页判断加载的时候调用了一个方法暂时也就屏蔽了,内容无异,相反各方面数据都明显提高。
    问题解决很大一部分
    问题解决很大一部分ajax

涉世总结 秘籍书写

xhprof 性能分析器的使用

1.安装扩展,选择适合本身版本的xhprof,phpinfo查看适合安装成功
2.简单的调试,数据模式+可视化模式sql

/**
 * xhprof start
 * XHPROF_FLAGS_NO_BUILTINS (integer) 使得跳过全部内置(内部)函数。
 * XHPROF_FLAGS_CPU (integer) 使输出的性能数据中添加 CPU 数据。
 * XHPROF_FLAGS_MEMORY (integer) 使输出的性能数据中添加内存数据。 
 */
xhprof_enable(XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_CPU);
function useXhprof() {
    $str;
    $i = 1000;
    while (($i--)>=0) {
        $str .= $i;
    }
    return $str;
}
useXhprof();
$xhprof_data = xhprof_disable();
print_r($xhprof_data);
/**
 * 截取部分参数含义表示
 * [main()==>useXhprof] => Array ( 
 *      [ct] => 1       useXhprof函数的调用次数
 *      [wt] => 2064        消耗的时间,单位为微秒
 *      [cpu] => 0      cpu时间
 *      [mu] => 3744        内存使用状况,单位byte
 *      [pmu] => 728        峰值内存使用状况
 * )
 */
/**
 * 可视化 这里按照本身的状况设置好参数 clone地址:https://github.com/phacility/xhprof 
 */
$XHPROF_ROOT = realpath(dirname(__FILE__) .'/xhprof');
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
echo "<a href='/xhprof/xhprof_html/index.php?run=$run_id&source=xhprof_foo'>look</a>";

可视化测试图例

相关文章
相关标签/搜索