本故事根据真实故事书写,如有雷同绝非巧合。在开发过程中难免反复修改程序,面对突然起来的问题难免束手无策,有些人选择自我处理问题,也有人选择交流区域咨询,或许恰巧有人有类似的问题,刚好可以解决你的问题,但是如果你的问题恰好有些独特,最后还是需要自己谷歌百度,大海捞针似的搜寻。一套几年前的程序,现在急需大范围使用起来,优化了一些细节,由于业务的转型,全线使用php快速解决方案,于是乎就没有测试其他问题匆忙上线了。
去年上线,上线肯定难以避免很多细节问题,优化优化,最大的优化就是布局模式增加,常见的企业网站布局方式难免那么几种,于是在总结常见情况的基础下开始了布局设计。大致分析为如下草图。
首页布局模式比起之前的要多一些,全部模块容器是自适应的,无内容的情况下自动收缩。left与right默认情况下保留一种,按钮提示网站编辑人员自动激活。
开发过程中必须要有一套统一的规范,但常常有这样的情况,第一规范运行后有一批产出的时候,优化细节后又上了第二规范,初入江湖的时候已经是正式大范围使用的第三次规范了,也就是说之前有异议。这个只是说在使用过程中如果遇见之前版本的,重新按照新的规范优化上线,对于没有使用到的暂时就保持原型。
渐渐的布局的问题趋于平静,伴随着这种平静迎来的一个新的难题,服务器CPU飙高,卡死。
这个是我今天主要分享的故事,公司由于自身条件的问题,一直使用的windows+iis+mysql+php(asp),在win上使用iis运行php,使用过这样生产环境的应该知道上面的各种问题,但是实际问题还是实际问题,改变不了只能按照这种环境来做适应。其他问题暂且不描述了,说来就话长了。
除了服务器的原因,肯定的还是程序有问题了。
工具的选择
之前还没有这么细致的优化过程序,完全不知道如何开始下手。在 @luofei614 的建议下推荐我试试xdebug,xhprof,使用就是oneApm,其中oneApm简单很多,搜索了一下发现是蓝海讯通的项目,这里好像有一个认识的人 @互联网fans ,他们的态度的确不错,只是我只是抱着试试的心态注册使用了,很是挺不错的,但是只有linux的,在win上的方案没有,下了key下来也没有使用,第二天客服竟然通过我留下的电话联系了我,咨询相关情况,还好没有留下企业名称要不就暴露了。态度不错,但是肯定是有原因的…
无奈下一个工具,之前其实就了解过这些工具,但是一直没有落实过使用方法,这次是被逼无奈的。尝试了使用 xedebug ,安装过程什么都还是比较愉快,但是就是扩展始终加载不起。在 官网文档 上找到了问题的原因:
> 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.
正式开始检查优化工作
一个好的工具往往是解决问题的关键方案,知道根本原因,然后对症下药。安装好了xhprof,检测了一下程序现在的运行情况
从图中可以看出大量文件操作导致CPU占用极高,找到问题就是接下来优化问题,程序中有使用一个mysql_fetch_object(),表面看是没有什么问题的, php官网文档 ,中描述的是接收一个资源结果集作为参数。但是程序中这里使用了多个参数,搜索了一下找不到答案,有几个简单的描述,但是还是不能理解,还希望熟悉的指教一下,谢谢。我暂时直接取消后两个参数,相应的首页判断加载的时候调用了一个方法暂时也就屏蔽了,内容无异,相反各方面数据都明显提升。
1.安装扩展,选择适合自己版本的xhprof,phpinfo查看适合安装成功2.简单的调试,数据模式+可视化模式
/** * 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>";