処理速度の高速化その1
最近は処理速度の高速化をいろいろ考えることがある。
高速化といってもいろいろある。実際に速度自体が変わっていなくても、気分的に早く動いているように感じさせる場合もあれば、実際に処理速度を改善させる場合もある。前者でいえば、例えばクリックして次の画面が出るまでの間、「Now Loading」を表示させたりする。処理速度自体はまったく変化がないが(むしろ遅いか)、何らかの視覚的なアクションによってストレスを軽減させるのがいい例だ。最近はAJAXを使って、非同期通信かつインタラクティブな構成を検討することも多い。
後者は実際に処理速度向上を図る方法。わかりやすい例で言えば、プログラム内に無駄な処理があれば、それを削除することによって少し速くなるはずだ。あとSQL文の実行に時間がかかる場合がある。そんなときはSQL文を見直すだけで速度向上につながることがある。
今日は後者のお話。最近Web APIを使ったウェブアプリを各機会が多い。一つのPHPプログラムにアクセスした際に、複数のAPIをコールして処理することもあるわけだが、普通に記述するならfile_get_contentsを数回書けばいい(実際そうは書かないけれど)。でもこれだと、当たり前だけれどfile_get_contentsの回数分だけ処理に時間がかかる。でも、一度に複数のAPIコールを実現することができる、といわれるとちょっと興味をそそられる。PHP5からはそんな機能が実装されているらしいのだ。記事元はこちら。
PHP5にはcURL関数群に新しくcurl_multi_を接頭辞に持つ関数がいくつか追加されている。まさしく「curlをmultiに実現する」ための関数群だ。PHPのマニュアルから引用すると、
// cURL リソースを作成します
$ch1 = curl_init();
$ch2 = curl_init();// URL およびその他適切なオプションを設定します。
curl_setopt($ch1, CURLOPT_URL, “http://www.example.com/”);
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, “http://www.php.net/”);
curl_setopt($ch2, CURLOPT_HEADER, 0);// マルチ cURL ハンドルを作成します
$mh = curl_multi_init();// ふたつのハンドルを追加します
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);$running=null;
// ハンドルを実行します
do {
curl_multi_exec($mh,$running);
} while ($running > 0);// ハンドルを閉じます
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
すごーい。こんなことが本当にできちゃうんだなぁ、驚いてしまった。こういう情報ってもっとどんどん世の中に出回ってくればいいのに・・・。最近PHPのMLもろくに読んでいないので、情報を見つけられないでいるだけかもしれない。やっぱり業務に追われるってのはよくない。マニュアルも定期的に目を通さないと、だな。