我正在尝试将慢查询日志记录实现到我的数据库类中,但是我得到了奇怪的结果。它目前“主要”记录所有查询,并且它表示大多数查询运行大约需要0.8秒,我不明白,因为这是在我的开发人员计算机上,并没有负载过重。
天啊,我甚至尝试在phpMyAdmin中运行查询,并且它们在那里非常快。
我把它放在错误的地方吗?或者我错过了什么?
class database {
protected $_mysqli;
protected $_debug;
public function __construct($host, $username, $password, $database, $debug) {
$this->_mysqli = new mysqli($host, $username, $password, $database);
$this->_debug = (bool) $debug;
if (mysqli_connect_errno()) {
if ($this->_debug) {
echo mysqli_connect_error();
debug_print_backtrace();
}
return false;
}
return true;
}
public function q($query) {
$incomingq = $query;
if ($query = $this->_mysqli->prepare($query)) {
if (func_num_args() > 1) {
$x = func_get_args();
$args = array_merge(array(func_get_arg(1)),
array_slice($x, 2));
$args_ref = array();
foreach($args as $k => &$arg) {
$args_ref[$k] = &$arg;
}
call_user_func_array(array($query, 'bind_param'), $args_ref);
}
// Settings
$SLOW_LOG_TIME = 0.8; // (sec)
$SLOW_LOG_FILE = 'php_slow.txt';
$SLOW_LOG_START = time(); // (sec)
$query->execute();
// Logging
$SLOW_LOG_END = microtime(TRUE);
$time = $SLOW_LOG_END - $SLOW_LOG_START;
if ($time > $SLOW_LOG_TIME)
{
$log = date('Y-m-d H:i:s') . "\t" . round($time, 3) . "\t" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] . "\t" . str_replace(array("\t" , "\n"), "", $incomingq) . "\r\n";
$fp = fopen($SLOW_LOG_FILE, 'a+');
fwrite($fp, $log);
fclose($fp);
}
if ($query->errno) {
if ($this->_debug) {
echo mysqli_error($this->_mysqli);
debug_print_backtrace();
}
return false;
}
if ($query->affected_rows > -1) {
// if ($query->sqlstate == "00000") {
return $query->affected_rows;
}
$params = array();
$meta = $query->result_metadata();
while ($field = $meta->fetch_field()) {
$params[] = &$row[$field->name];
}
call_user_func_array(array($query, 'bind_result'), $params);
$result = array();
while ($query->fetch()) {
$r = array();
foreach ($row as $key => $val) {
$r[$key] = $val;
}
$result[] = $r;
}
$query->close();
return $result;
}
else {
if ($this->_debug) {
echo $this->_mysqli->error;
debug_print_backtrace();
}
return false;
}
}
public function handle() {
return $this->_mysqli;
}
public function last_insert_id()
{
return $this->_mysqli->insert_id;
}
}
答案 0 :(得分:5)
您使用了错误的单位测量:$SLOW_LOG_START = time();
,
time()是秒。
应与$SLOW_LOG_END = microtime(TRUE);
一致。
虽然,microtime(TRUE)是微秒。
因此,请更改$SLOW_LOG_START = microtime(TRUE);
答案 1 :(得分:3)
您的开始时间到最近的秒,结束时间到最近的微秒。
对microtime
使用$SLOW_LOG_START
,否则您的测量结果可能只差一秒钟。
那应该解决你的问题。
答案 2 :(得分:2)
我确定你已经知道了,但MySQL有自己的slow query logger来记录超过指定时间的任何查询。这样,您需要自己构建它。