PHPのパース時間&MySQLの最終更新日時取得

投稿日:

「嗚呼、ミッドウェイ海戦の日(1942/6/5。聯合艦隊の、すなわち海洋国家たる大日本帝国の終わりの始まりの日)だなぁ」等と言いつつ、久々にPHPなんか触ってます。

まず、動的生成のページによくある「パース時間の表示」を付けようと調べてみました。

microtime -- 現在のUNIXタイムスタンプをマイクロ秒まで返す

に殆どそのままのサンプルコードが載ってましたんで作業自体はコピペで終わるんですが…この短いサンプルコードが何をしてるのかがイマイチ解りません(^_^;)

function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$sec + (float)$usec);
}

今まで使ったことなかったんですが、microtime()という関数は

文字列 "msec sec" を返します。sec は現在時刻を Unix epoch (1970年1月1日 00:00:00)からの通算秒としたもので、msec は マイクロ秒の部分です。

ということなんだそうです。

実際に

<?php echo microtime(); ?>

とだけ書いたPHPファイルにブラウザでアクセスしてみると

0.68644800 1086570144

という出力が得られました。ふむふむ、空白の前がマイクロ秒(小数点以下の部分)、空白の後ろが秒なので、これを空白で分割して各々変数に収納し、それを足してやる事で

起動された時点での1970年1月1日からの通算秒

を得る仕掛けなんですな。なるほどなるほど、ようやく理解。

ということで、このgetmicrotime()をそのまま頂いてきてスクリプトの先頭でgetmicrotime()の値を一旦変数に代入、スクリプトの末尾で現getmicrotime()と引き算をする事で「パース時間」を取得出来るようになりました(^_^)

パース時間の表示が最下部に多いのは、この同じような仕掛けを使ってるヒトが多いからなんでしょか? それとも、単純にレイアウトの都合なのか…??

データベースの最終更新時刻は当初

$path = "/var/lib/mysql/" . $database . "/" . $table . ".MYD" ;
$renewed = filemtime($path);

↑こんなコードを書いて取得しようとしてた(^^;んすが、

(errno=13 - Permission denied)

と叱られてどうにもならず。実際にデータベースの最終更新時刻を表示しているphpMyAdminのコードを追ったところ、

$info = mysql_fetch_array(mysql_query("show table status"));
echo $info["Update_time"];

↑こんな感じなことを発見。

mysql> show table status;
+------+--------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+----------------+---------+
| Name | Type | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Create_options | Comment |
+------+--------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+----------------+---------+
| list | MyISAM | Dynamic | 6934 | 128 | 891176 | 4294967295 | 744448 | 0 | NULL | 2004-06-05 07:50:31 | 2004-06-05 07:50:41 | NULL | | |
+------+--------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+----------------+---------+
1 row in set (0.00 sec)

要するに、PHP側で要らんことをしなくても、MySQLSHOW TABLE STATUSというSQLを送ればMySQLがステータスを返してくる→ただこれを受け取ればいいだけなんすね(^^;;

$info = mysql_fetch_array(mysql_query("show table status like '$table'"));
echo $info["Update_time"] . "<br>\n";

実際に使ったコードは↑こんな感じ。コレで$tableに入れてるテーブルの最終更新日時を取得できます。

$sql="select ext, sum(filesize) as total, count(*) as num from " . $table ." group by ext having sum(filesize) >= 1000000000 order by total desc";

↑こちらも今回覚えた新しいSQL。

ext(拡張子)毎に、ファイルサイズの合計をtotal、ファイル数をnumとして各々集計しなさい。ただし、集計の対象とするのはファイルサイズの合計が1000000000バイト以上のもののみ。並び順はファイルサイズ合計の逆順(大きい順)

という内容がコレ1文で済んじゃいまして、改めてSQLの威力を痛感してたりします。データベースを使わずに自分でこのロジックを組もうと思うと、結構タイヘン。