某大型网站Discuz系统被大量改动过,经历了几代程序程序员的努力之后,慢查询日志越来越多,有一些更牛逼的sql查询语句扫描全表,上千万行的数据量,把Mysql累死了。于是就想到如果找到这段代码,但是总是找不到。
没办法想了一计策,要知道所有的discuz的查询都要经过:discuz_database.php的query去执行,所以监控这里即可。
discuz_database.php文件;
public static function query($sql, $arg = array(), $silent = false,
$unbuffered = false) {
if (!empty($arg)) {
if (is_array($arg)) {
$sql = self::format($sql, $arg);
} elseif ($arg === 'SILENT') {
$silent = true;
} elseif ($arg === 'UNBUFFERED') {
$unbuffered = true;
}
}
self::checkquery($sql);
改为:
public static function query($sql, $arg = array(), $silent = false,
$unbuffered = false) {
if (!empty($arg)) {
if (is_array($arg)) {
$sql = self::format($sql, $arg);
} elseif ($arg === 'SILENT') {
$silent = true;
} elseif ($arg === 'UNBUFFERED') {
$unbuffered = true;
}
}
self::checkquery($sql);
//监控开始,start by:www.jincon.com
$rqurl = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : "";
$fp = fopen("sql.log", "a+");
fwrite($fp, $rqurl." = ".$sql."\r\n");
fclose($fp);
//end
这样就会监控到执行的sql,如果需要,也可以加一个if条件判断,找出某一固定的慢查询sql语句: