phpで総カウント数を日付から合算して取得する

どうも、中原電車区のトトロです。

管理人(私)はYouTubeMP3もどきというサイトをやっているのですが、
2018年の11月15日から1日あたりの変換数をカウントするようにしました。

動機は個人的にどれくらい変換されてるのか知りたい、という単純な理由ですが、
仕組み的にはcount_20181115.datみたいなファイルに一日ごとの変換回数を書き込み、
count_all.datに総変換回数を書き込む、というように処理していたわけです。
なんですが、最近うまくカウントをcount_all.datに書き込めなかったらしく、総変換回数が0からリセットされてしまい、用をなさなくなってしまいました。

一応ディレクトリの中にはcount_20181115.dat・count_20181116.datみたいな一日の変換回数を記録したファイルが残っているので、その中身を全部取得できれば正確な総変換回数が取得できそうなものですが、ファイル名があいにく日付で連番ではないので、日付を足してその日付のカウントファイルを読み込んで…みたいな処理をすることになったんですが思ったよりつまずいたのでメモ。

割と汎用性がありそうなので初心者ゴミプログラマーが書いたゴミみたいなクソース置いときます、ご自由に使って書き換えて、どうぞ。

おソース

allcount.php

<?php

//設定
//カウントファイルの場所
$countdir = "../data/count/";

//総変換回数を書き込むファイルの定義
$allcountfile = "../data/count/count_all.dat";

//変換数の合算を開始する日付(変換回数をカウントし始めた日付)
$startdate = "2018/11/15";


//カウントファイルの個数を取得
$datfiles = glob($countdir. DIRECTORY_SEPARATOR . "*.dat");
$countfiles = count($datfiles) - 1;

$allcount = 0; //定義

$targetTime = strtotime($startdate); //タイムスタンプを取得

//出力

echo "カウントファイル数:".$countfiles."<br>\n";

echo "合算を開始する日付:".$startdate."(タイムスタンプ:".$targetTime.")<br>\n";

echo "総変換回数の合算を開始します。<br><br>\n";

//カウントファイルの内容を順次取得して足す
for ($i = 0; $i < $countfiles; $i++){
	$timestamp = strtotime('+'.$i.' day' , $targetTime); //タイムスタンプに$i日足す
	$file = $countdir."count_".date("Ymd",$timestamp).".dat"; //それぞれのカウントファイルのファイル名を指定
	$count = file_get_contents($file); //それぞれのカウントのファイルの中身を取得して代入
	$allcount = $allcount + $count; //$fileの内容を読みこんで$allcountに足す
	echo $file."…".$count."回 総変換回数…".$allcount."回<br>\n";
}

//file_put_contentsでファイルに総変換数をを書き込んで変数に代入
$res = file_put_contents($allcountfile, $allcount); 

//出力

echo "<br>\n";
echo "総変換回数(".$startdate."~): ".$allcount."回<br>\n";

if($res){
	echo "<br>ファイルの書き込みに成功しました!<br>\n";
	echo "ファイルに書き込まれたバイト数:".$res."<br>\n";
	echo "<br>\n";
} else {
	echo "<br>ファイルの書き込みに失敗しました…<br><br>\n";
	echo "<br>\n";
}

?>

処理内容

コメントを山ほど書いているので不要だと思いますが一応処理内容を説明しとくと、

  1. カウントファイルの個数を取得する(今回の場合同じディレクトリにcount_all.datがあったため-1をしているがお好みで書き換えて下さい)
  2. 合算を開始する日付をstrtotime()関数で一旦タイムスタンプ形式に直す
  3. forループでカウントファイルの個数になるまで繰り返す
    1. 合算を開始する日付のタイムスタンプに+ $i 日足して変数に代入
    2. その足したタイムスタンプをdate()関数で日付に戻して読み込むファイル名を生成
    3. 生成したファイル名のファイルをfile_get_contents()で読み込んで変数に代入
    4. 取得した一日のカウント数を$allcountに足す
  4. file_put_contentsで取得が完了した総変換回数を書き込む
  5. 出力

という感じです()

以上!!閉廷!!

コメント