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 相关文章推荐
文件上传的实现
Oct 09 PHP
利用php来自动调用不同服务器上的flash
Oct 09 PHP
php 文件上传类代码
Aug 06 PHP
用PHP+MySQL搭建聊天室功能实例代码
Aug 20 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
Jun 04 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
PHP+APACHE实现网址伪静态
Feb 22 PHP
PHP常用处理静态操作类
Apr 03 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
php模板引擎技术简单实现
Mar 15 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
Apr 02 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 inc文件使用的风险和注意事项
2013/11/12 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
js放到head中失效的原因与解决方法
2017/03/07 Javascript
react-native ListView下拉刷新上拉加载实现代码
2017/08/03 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
python3将视频流保存为本地视频文件
2018/06/20 Python
Django框架实现逆向解析url的方法
2018/07/04 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
解决django FileFIELD的编码问题
2020/03/30 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
Python爬取某平台短视频的方法
2021/02/08 Python
HTML5 canvas基本绘图之绘制五角星
2016/06/27 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
生产车间主任的个人自我鉴定
2013/10/25 职场文书
运动员获奖感言
2014/08/15 职场文书
上课玩手机的检讨书
2014/10/01 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2015年新农合工作总结
2015/03/30 职场文书
大学生暑期实践报告
2015/07/13 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL