php垃圾代码优化操作代码


Posted in PHP onAugust 05, 2010

公司有几个网站搭在美国的虚拟主机上,服务器上的mysql服务差不多每一天都会突然不知什么时候挂掉,然后过一会又恢复了,怀疑是超出cpu的使用限制而被自动结束了,但是实际上该服务器上的流量很小。于是早先的时候联系了服务器提供商的印度阿三客服,想看看是不是其他用户搞多了害的大家一起死,阿三们查找了之后,信誓旦旦的拍着长毛的胸部保证不是他们的问题,事情没有解决。悬着不是个事,只好自己查了,好在可以访问到information_schema库,看了看,没话了,user_statistics里面的数据显示我们的一个mysql用户在busy_time,cpu_time等指标上都高到不行,自己的事,好在阿三没有发现。于是赶紧查程序,之前的这个网站程序不是由我做的,但是知道里面问题很多,架构到实现都有问题,但是页面不是一般的多,代码夹杂着html,全看过去还不死,(这种时候就尤为的觉着mvc多美妙),平时能凑合着运行就可以了,反正没有什么访问量。

既然是mysql的负担重,那就先找这个,本地上搞一个网站的镜像运行下,在my.ini里修改添加

[mysqld] 
log="d:/temp/mysql.log" 
log_slow_queries="d:/temp/mysql_slow.log" 
long_query_time=1

这个目录是要已经存在的。重启mysql服务,就可以记录了。

查看sql记录后大吃一惊,查询的数量惊人,随便一个页面,sql查询都在几十条,多的有上千条!

以论坛来说吧,一个页面的数据库查询次数也就是10次一下,用了缓存的还可以再低。这样算的话,就相当于原来几十倍的负担,能不挂?

谁人也不能那边有毅力写下上百条的查询啊,所以肯定是循环查询。sql语句也表明这一点。知道原因了就好改了,找到相关页面,改掉循环查询,例如,有一个页面,要显示所有地区分类和该分类下的文章数,先不考虑数据库的结构优化,就程序而言,原来的大概是这样子的

$sql1="SELECT aid,count(*) as cc FROM pz_content WHERE uid=$uid group by aid"; 
$rs1=$db->query($sql1); 
if(is_array($rs1)){ 
foreach($rs1 as $r1){ 
输出... 
echo id2name($r1->aid); 
} 
} 
............ 
function id2name($aid) 
{ 
$sql="select ename from pz_area_a where aid_a=".$id; 
$result=mysql_query($sql); 
$row=mysql_fetch_object($result); 
return $row->ename; 
}

先不管代码的容错,看实现就知道,他先读取了该用户的相关文章并按地区ID进行了分组和统计个数,然后再每个地区每个地区地输出地区名字,所以,如果有1w个地区,这里就要查询1w次。放上一个计时的代码,看了下,大概耗用内存6M,执行时间16秒,累计查询1001次

其实,这里是只要用一句sql就可以搞定的事情,并不需要循环。

$sql1="select pz_area.aid,pz_area.ename,tb1.cc from pz_area right join (SELECT aid,count(*) as cc FROM pz_content WHERE uid=$uid group by aid) as tb1 on pz_area.aid=tb1.aid"; 
$rs1=$db->query($sql1); 
if(is_array($rs1)){ 
foreach($rs1 as $r1){ 
输出... 

 echo $r1->ename; 

} 
}

问题就可以解决了。重新运行下,内存耗用差不多,查询1次,CPU执行时间只有647毫秒,和原来的差了26倍!再看一下,发现这个pz_content的表,记录还算比较多的,有经常要按地区查询划分之类的,但是原来什么索引也没有。顺道在aid上加上一个索引,执行时间缩短到432毫秒。

这个页面的事情算了了,先到这里,下次继续。

PHP 相关文章推荐
php数据库连接
Oct 09 PHP
使用Xdebug调试和优化PHP程序之[1]
Apr 17 PHP
php Sql Server连接失败问题及解决办法
Aug 07 PHP
php在线解压ZIP文件的方法
Dec 30 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 PHP
PHP isset()及empty()用法区别详解
Aug 29 PHP
PHP MemCached 高级缓存应用代码
Aug 05 #PHP
phpMyAdmin 链接表的附加功能尚未激活的问题
Aug 01 #PHP
PHP合并数组+与array_merge的区别分析
Aug 01 #PHP
PHP自定义函数收代码
Aug 01 #PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
Aug 01 #PHP
PHP5中使用PDO连接数据库的方法
Aug 01 #PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
Aug 01 #PHP
You might like
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
javascript innerHTML、outerHTML、innerText、outerText的区别
2008/11/24 Javascript
老鱼 浅谈javascript面向对象编程
2010/03/04 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
python读写ini文件示例(python读写文件)
2014/03/25 Python
实例说明Python中比较运算符的使用
2015/05/13 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Python Collatz序列实现过程解析
2019/10/12 Python
在python中求分布函数相关的包实例
2020/04/15 Python
浅析Python __name__ 是什么
2020/07/07 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
30岁生日感言
2014/01/25 职场文书
群教个人对照检查材料
2014/08/20 职场文书
2014年社区工作总结
2014/11/18 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
深入浅析Django MTV模式
2021/09/04 Python