Ads by Google
新しい記事を書く事で広告が消せます。
大量の処理。それは例えば100000件のSQLを生成・発行するような処理であるとか、WEBネイルを1000件作成する処理であるとかですが、そういった処理を8秒以内に完遂させることはとても困難です。
高級なハードウェア、効率的なコーディングといった理想的な環境を用意したとしても、結局は件数に押しつぶされてしまいます。(そもそも予算や技術力、人員の問題で、理想的な環境を用意すること自体が困難なことです)
そういうどうにもならない処理はバックグラウンドに回してしまいます。
ブラウザからの操作は行わないか、あるいは行ってもトリガーの記録だけにとどめ、処理自体はバックグラウンドで行うわけです。
PHPにもCLIがあります。CやJAVAができる人なら処理をそちらに回してしまうのもありです。また、SQLやメールなら利用しているアプリケーションに直接あたるのもいい方法です。
名前を出すのがはばかられますのである業務用システムとしておきますが、そこでは顧客データを集計してCSV出力する際にこの手法が使われています。
流れとしては
といったものになっていました。
さて実際のコードをご紹介します。みんなの動画サーチで今現在動いているコードを例として用意しました。
みんなの動画サーチではタグの関連を元に関連動画を表示していますが、その計算のためには各タグが一度分割されている必要があります。ところがユーザーから入力されるタグは、ひとまとめに「hatune;初音ミク;music」のようになっていて、そのままでは使えません。
そこで、いったんこれらを 「hatune」「初音ミク」「music」のように分割して別の専用テーブルに入力しているのがこの処理です。
$file_name = DBFILE_DIR."setmytag.sql";
@unlink($file_name);
writeFile_a($file_name , "set names utf8;");
$SD_Con = new SD_Movie;
$Movies = $SD_Con->getNomytag();
if(empty($Movies)) return; //新規に追加された動画がない場合は処理を中止(=動画の追加がトリガー)
$SD_MyTag = new SD_MyTag;
foreach($Movies as $Movie){
foreach(explode(";" , $Movie["tag"]) as $Tag){
$MyTag = new MyTag;
$MyTag->movie_id = $Movie["id"];
$MyTag->tag = trim($Tag);
$Sql .= $SD_MyTag->makeInsert_SQL($MyTag); //データベースに接続はしていない
}
}
writeFile_a($file_name , $Sql);
shell_exec('mysql -u user -h '.HOST.' --password=password video_search_japan < '.$file_name);
上記は実際のコードです。一度の処理で専用テーブルに入力されるレコード数は最大でだいたい1000程度と踏んでいます。
$Sql .= $SD_MyTag->makeInsert_SQL($MyTag);
コードのなかのこの部分はSQL文を作っているだけで、データベースへのアクセスは行われません。そのため、ループの中にあっても大丈夫です。
shell_exec('mysql -u user -h '.HOST.' --password=password video_search_japan < '.$file_name);
shell_exec()で直接MYSQLにあたり、作成したファイルを読み込ませています。PHPから実行するよりもはるかに高速かつ低負荷で同じ結果を得ることができます。
運用ポリシー上shell_exec()を使いたくない場合はCronで回しても問題ありません。
私がここでshell_exec()を使っているのは、SQL文を出力したファイルの作成と、Cronで行う処理のタイミングがずれてしまい、ファイル作成→Cron処理となるはずがCron処理→ファイル作成 となってしまう可能性を排除したかったからです。
そして、この処理自体はCronでまとめて夜間に行われています。Cronの記述はこうなっています。
5 3 * * * /usr/bin/php /var/www/html/movie-search/cron_daily.php
ユーザーが行うおすすめ動画の登録処理がトリガーにあたる部分です。その日新しく追加された動画がある場合のみ処理が行われます。
みんなの動画サーチ 現在の人気動画