Slide 20
Slide 20 text
Async : PHP vs C#
// 並列通信用マルチハンドルを用意
$mh = curl_multi_init();
// 通信先ごとにCurl Handleを作り、それを $mh にaddしていく
$ch_news = curl_init("http://dailynews.yahoo.co.jp/fc/entertainment/rss.xml");
curl_setopt($ch_news, CURLOPT_RETURNTRANSFER, TRUE);
curl_multi_add_handle($mh, $ch_news);
// 同様に
$ch_music = curl_init("http://magazine.music.yahoo.co.jp/rss/ALL/rss.xml");
curl_setopt($ch_music, CURLOPT_RETURNTRANSFER, TRUE);
curl_multi_add_handle($mh, $ch_music);
// 同様に
$ch_trend = curl_init("http://searchranking.yahoo.co.jp/rss/trend-rss.xml");
curl_setopt($ch_trend, CURLOPT_RETURNTRANSFER, TRUE);
curl_multi_add_handle($mh, $ch_trend);
// せーので複数の通信を同時実行。whileで全て返ってくるのを待ちます
do { curl_multi_exec($mh, $running); } while ( $running );
// 個々のXMLは、それぞれのCurl Handleを指定することで取得できる
$rss_news = curl_multi_getcontent($ch_news);
$rss_music = curl_multi_getcontent($ch_music);
$rss_trend = curl_multi_getcontent($ch_trend);
// 後始末
curl_multi_remove_handle($mh, $ch_news);
curl_close($ch_news);
curl_multi_remove_handle($mh, $ch_music);
curl_close($ch_music);
curl_multi_remove_handle($mh, $ch_trend);
curl_close($ch_trend);
curl_multi_close($mh);
// リクエストするClientの用意
var client = new HttpClient();
// 非同期リクエスト
var news = client.GetStringAsync("http://dailynews.yahoo.co.jp/fc/ente
var music = client.GetStringAsync("http://magazine.music.yahoo.co.jp/r
var trend = client.GetStringAsync("http://searchranking.yahoo.co.jp/rs
// 非同期待機
await Task.WhenAll(new[] { news, music, trend });
// 個々のXMLは変数のResultを指定するだけで取れる
Console.WriteLine(news.Result);
Console.WriteLine(music.Result);
Console.WriteLine(trend.Result);
PHPの例は以下のYahooのTech Blogより引用
http://techblog.yahoo.co.jp/architecture/api1_c
url_multi/