世界中の共有動画を横断検索。youku.com,youtube,tudou.com,Dailymotionに対応。・・・そんなサービスの開発者ブログ。

みんなの動画サーチ

個人メニュー
最近見た動画

サービス:みんなの動画サーチ   利用できる動画共有サイト : youku.com , youtube , tudou.com , Dailymotion

Ads by Google

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--------(--)

みんなの動画サーチを実例としたPHPでの開発における負荷対策について 第7回 〜バックグラウンドでの処理の活用〜

 処理の中には、どう工夫しても多大な時間を要するものがあります。
・大量のSQL文の発行
・データの変換処理
・統計データの生成
 などです。これらを画面上で行おうとすると、ユーザーを長時間待たせることとなり適切ではありません。ですが、こういう処理を手早く行うにも限界が存在します。

 こういった時に活用できるのが処理をバックグラウンドに回してしまう手法です。

 というわけで、みんなの動画サーチを実例としたPHPでの開発における負荷対策について 第7回は、バックグラウンドでの処理を活用してレスポンスを向上させ、かつ負荷を削減する手法について、実際のコードを使いながら述べていきたいと思います。

処理が多すぎて応答時間が長い!

 大量の処理。それは例えば100000件のSQLを生成・発行するような処理であるとか、WEBネイルを1000件作成する処理であるとかですが、そういった処理を8秒以内に完遂させることはとても困難です。
 高級なハードウェア、効率的なコーディングといった理想的な環境を用意したとしても、結局は件数に押しつぶされてしまいます。(そもそも予算や技術力、人員の問題で、理想的な環境を用意すること自体が困難なことです)

遅い処理はバックグラウンドに回してしまう

 そういうどうにもならない処理はバックグラウンドに回してしまいます。
 ブラウザからの操作は行わないか、あるいは行ってもトリガーの記録だけにとどめ、処理自体はバックグラウンドで行うわけです。
 PHPにもCLIがあります。CやJAVAができる人なら処理をそちらに回してしまうのもありです。また、SQLやメールなら利用しているアプリケーションに直接あたるのもいい方法です。

ある業務用システムの場合

 名前を出すのがはばかられますのである業務用システムとしておきますが、そこでは顧客データを集計してCSV出力する際にこの手法が使われています。
 流れとしては

  1. ユーザーがCSV出力をブラウザから依頼
  2. ひとまず「処理を受け付けました。しばらく待ってから、CSV出力ファイル一覧画面からダウンロードしてください」と先にメッセージが出る(この間数秒)
  3. 30分程度待ったあと
  4. CSV出力ファイル一覧画面から顧客データの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

 ユーザーが行うおすすめ動画の登録処理がトリガーにあたる部分です。その日新しく追加された動画がある場合のみ処理が行われます。

tag : php 負荷対策 みんなの動画サーチ

2008-05-01(Thu)

 みんなの動画サーチ 現在の人気動画

RSSフィード
最近の記事
月別アーカイブ
カテゴリー
逆アクセスランキング
プロフィール

Author:ナカタツ
 共有動画サーチの開発をやっているフリーランサーです。プログラム歴は趣味で使っていた頃も合わせるとちょうど今年で10年目。最近はPHPばかり使ってます。
 私に興味を持ってくださる方はお気軽にご連絡ください。Skypeでお話できる人歓迎。メールフォームはこちら

カレンダー
10 | 2009/11 | 12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -

みんなの動画サーチへ戻る

カテゴリ:芸能・テレビ | 音楽 | アニメ | おもしろ | 神・衝撃 | ゲーム | 動物 | スポーツ | 時事ニュース | 自然・歴史 | 車・バイク | セクシー


アクセス解析 アクセスランキング
  • seo

Powered by FC2 Blog

FC2Ad

FC2ブログ

Copyright © みんなの動画サーチ開発者ブログ All Rights Reserved.