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将mysql数据库整库导出生成sql文件的具体实现
Jan 08 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 PHP
PHP简单获取视频预览图的方法
Mar 12 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
Jun 19 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
Nov 30 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
CI框架(CodeIgniter)实现的导入、导出数据操作示例
May 24 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
php转换上传word文件为PDF的方法【基于COM组件】
Jun 10 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几个数学计算的内部函数学习整理
2011/08/06 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
2020/04/04 jQuery
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
Python pickle模块用法实例
2015/04/14 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
破解安装Pycharm的方法
2018/10/19 Python
对pandas处理json数据的方法详解
2019/02/08 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
初中生自我鉴定
2014/02/04 职场文书
护理不良事件检讨书
2014/02/06 职场文书
计算机专业应届生求职信
2014/04/06 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
化验室安全管理制度
2015/08/06 职场文书
门面租赁合同范文
2019/08/06 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL