迁离SAE系列:次数优化篇
一,前言:
新浪云计算平台SAE更改了计费策略后,新的计费策略使得网站运行的成本越来越高,于是很多开发者包括本人都准备把应用和网站迁离SAE平台了。然而SAE平台跟普通PHP环境始终有区别。特别是当你的应用使用到SAE的一些云服务的时候,此时要迁移就必须改动下代码。本人将整理下自己迁离的一些经验,分享出来,希望对需要的人有帮助。
二,需求分析
我的网站是每天都不断有用户访问的,而说迁离总不能一下子就迁离了,改程序总需要时间。因为,首先要做的是,优化你的原程序,减少云豆消耗。而且云豆消耗下降了后,你迁离到新环境时服务器压力也会小些。 对于我的程序的实际情况,发现mysql的次数特别多特别消耗云豆,所以我决定在这方面下一下功夫。
三,主要的思路
记录下mysql语句的执行次数,把重复执行次数比较多的mysql语句进行程序优化,减少次数。
四,操作方法
1. 新建db_query_record表
请在数据库中执行以下sql语句:
CREATE TABLE IF NOT EXISTS `db_query_record` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`sql` varchar(255) NOT NULL,
`count` int(10) NOT NULL,
`execute_time` float NOT NULL,
`last_update_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sql` (`sql`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2. 改写mysql_query()
我们首先要在数据库执行前插入一段代码,此段代码的作用是把mysql语句的执行情况记录到数据库中。如果你是用PHP原生的mysql操作函数,那就可以写一个函数来替换mysql_query();如果你是用了一些mysql操作类,其更改原理也类似,你看完下面的代码应该会懂(如果你有编程经验的话)
function db_query($sql , $connection = ''){
//统计sql执行情况
$time1 = microtime();
$result = mysql_query($sql , $connection);
$time2 = microtime();
$execute_time = $time2 - $time1;
$sql = urlencode($sql);
$sql2 = "insert into db_query_record (`sql` , count , execute_time , last_update_time )values('$sql' , 1 , '$execute_time',now())ON DUPLICATE KEY UPDATE count = count +1 , execute_time = '$execute_time', last_update_time = now() " ;
mysql_query($sql2 );
return $result;
}
当写好上面这段函数代码后,然后把程序中所有用到mysql_query()的地方都替换为db_query()。大概程序执行半个小时到一个小时,db_query_record表便会收集到一定量的mysql语句执行记录。此时你可以暂时把db_query()里面关于记录的代码注释掉,以免记录语句给网站带来过大的压力。
3. 分析db_query_record表
首先将此表按照count字段进行倒序排序,找出执行次数最多的那些sql语句。然后分析能不能减少这些sql语句的执行。例如我发现“set names utf8”这条语句执行得非常频繁。SAE平台本来默认就是utf8编码,所以这条SQL语句明显可以不执行,去代码里注释即可。 其他分析方法也是类似的思路,结合业务情况,省略掉不必要的执行。
4. 结合xhprof工具来分析mysql调用情况
在SAE管理后台,进行自己的某个应用,在左侧栏的“开发与调优”-“XHProf”,便可看到XHProf在SAE的使用方法,此处不再介绍。重点介绍下优化思路。 查看XHProf的记录时,请重点查看db_query()函数的执行次数以及它的上级函数。比如说,我发现在访问“检查未读消息”接口的时候,db_query()执行了四次。我分别看了下这四次被调用的上级函数,发现有两次是检查邮件队列和系统通知队列。这两个操作对我的业务来说是比不必要的。因此可以把相关代码注释掉。 其他优化大体思路如此。
👿 🙂 😳 😳 😀
绝对赞成,一开始把个人信息还提交了,最终换来的是很差劲的服务!这就是云服务
好文,双手赞成!