yield(generator)でcurl_multi
をうまいこと書けるようにした関数のサンプル実装。
まだ結構バグバグなので、本番利用は危険です。
requirement:
- php >= 5.5
- ext-curl
$ composer require hirak/co-httpclient
<?php
require 'vendor/autoload.php';
use Spindle\HttpClient;
/**
* JSONを返すWebAPIをGETメソッドで叩く関数。
*
* - 待ちが発生するところにyieldキーワードを埋め込む。
* - returnの代わりにyieldキーワードを使う。
* - 例外は通常通り使用可能。
*/
function getWebapiAsync($url) {
$req = new HttpClient\Request($url);
/** @type HttpClient\Response */
$res = (yield $req);
if (($status = $res->getStatusCode()) >= 400) {
throw new \RuntimeException($url, $status);
}
yield json_decode($res->getBody());
}
//試しにpackagist.orgのjsonを取ってきてパースしてみる
// json_decodeなどはなるべくWebAPIの待ち時間中に処理されます。
list($jpmirror, $origin) = co(
getWebapiAsync('http://composer-proxy.jp/proxy/packagist/packages.json'),
getWebapiAsync('https://packagist.org/packages.json')
);
var_dump($jpmirror, $origin);
CC0-1.0 (Public Domain)