Skip to content

Instantly share code, notes, and snippets.

@donatj
Created February 23, 2012 20:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save donatj/1894956 to your computer and use it in GitHub Desktop.
Save donatj/1894956 to your computer and use it in GitHub Desktop.
Slow Query Log Parser
#!/usr/bin/php
<?php
$file = false;
$defaults = array(
'maxQueryTime' => pow(2,32),
'minQueryTime' => 0,
'maxLockTime' => pow(2,32),
'minLockTime' => 0,
'maxRowsSent' => pow(2,32),
'minRowsSent' => 0,
'maxRowsExamined' => pow(2,32),
'minRowsExamined' => 0,
);
$grep = false;
$args = $argv;
array_shift($args); //remove the name of the script we're running from the arguments
if( count($args) == 0 ) {
echo ' Matlock' . PHP_EOL;
echo '=============================' . PHP_EOL . PHP_EOL;
echo '----- Argument Defaults -----' . PHP_EOL . PHP_EOL;
foreach( $defaults as $key => $value ) {
echo ' --' . $key . '=' . $value . PHP_EOL;
}
echo PHP_EOL . PHP_EOL;
echo ' --grep="RegexFuntime"' . PHP_EOL;
die(1);
}
foreach( $args as $arg ) {
preg_match_all('/-(?P<arg>(max|min)[a-z0-9]+)=(?P<val>[0-9.]+)/i', $arg, $match, PREG_SET_ORDER);
if( $match ) {
if( !isset($defaults[ $match[0]['arg'] ]) ) {
echo 'Argument "'. $match[0]['arg'] .'" Not Recognized';
die(1);
}else{
$defaults[ $match[0]['arg'] ] = $match[0]['val'];
}
}elseif(preg_match('/-grep=(.*)/i', $arg, $match)){
$grep = $match[1];
}elseif( is_file($arg) && is_readable($arg) && !$file ) {
$file = $arg;
}
}
if( !$file ) {
echo 'Please specify a log file to parse!';
die(1);
}
$handle = @fopen($file, "r");
if ($handle) {
$hold = '';
$header_hold = '';
$match = false;
while (($buffer = fgets($handle, 4096)) !== false) {
preg_match_all('/# Query_time: (?P<QueryTime>[0-9.]+) Lock_time: (?P<LockTime>[0-9.]+) Rows_sent: (?P<RowsSent>[0-9]+) Rows_examined: (?P<RowsExamined>[0-9.]+)/', $buffer, $result, PREG_SET_ORDER);
if( $result ) {
if(
$match &&
$match['QueryTime'] >= $defaults['minQueryTime'] &&
$match['QueryTime'] <= $defaults['maxQueryTime'] &&
$match['LockTime'] >= $defaults['minLockTime'] &&
$match['LockTime'] <= $defaults['maxLockTime'] &&
$match['RowsSent'] >= $defaults['minRowsSent'] &&
$match['RowsSent'] <= $defaults['maxRowsSent'] &&
$match['RowsExamined'] >= $defaults['minRowsExamined'] &&
$match['RowsExamined'] <= $defaults['maxRowsExamined'] &&
( $grep === false || ereg($grep, $hold) )
) {
echo PHP_EOL . PHP_EOL . '# ---------------------------------' . PHP_EOL;
echo $header_hold . PHP_EOL;
echo $hold;
}
$match = $result[0];
$hold = '';
$header_hold = '';
}
if( $buffer[0] != '#' ) {
$hold .= $buffer;
}else{
$header_hold .= $buffer;
}
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment