curl_multiでPHPから並列アクセスを実現するサンプルを書いた

      2016/05/23

curl_multiでPHPから並列アクセスを実現するサンプルを書いた

PHPでは並列処理を実現する機能は基本的にありません。しかし、cURLを複数同時に実行するcurl_multiを利用すれば並列処理が一定可能です。並列して実行できるのでAPIへ効率よくアクセスすることが可能になります。

 

■並列にサイトにアクセスするサンプル

今回はそのサンプルを書いてみました。$urlListにアクセスしたいURLをhttp://またはhttps://から始まる形式で配列として入れておきます。するとその配列の数だけ並列アクセスします。

以下、サンプルとなります。実装に合わせてカスタマイズしてみてください。

<?php
/**
* 複数並列で実行します。
* 引数のurlListにアクセスしたいURLの一覧を配列で入れておきます。
*/
function multi_curl_execute($urlList, $timeout = 20) {

	// なにもないときは戻る。
	if (empty($urlList)) {
		return false;
	}

	// まずはMultiCurlを実行するための配列を作る。
	$chList = [];
	foreach($urlList as $url) {

		// CURL 初期化
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
		$chList[] = $ch;
	}

	// 存在しなければ戻る
	if (empty($chList)) {
		return false;
	}

	// マルチ cURL ハンドルを作成します
	$mh = curl_multi_init();
	foreach($chList as $ch) {
		curl_multi_add_handle($mh,$ch);
	}

	$running=null;
	// 全部実行します。すべて実行し終わるまで待ちます。
	do {
	    curl_multi_exec($mh, $running);
	    usleep(1000);
	} while ($running > 0);

	// 結果の取得
	$returnList = [];
	foreach($chList as $key => $ch) {
		$returnText = curl_multi_getcontent($ch);
		$returnList[] = $returnText;
	}

	// ハンドルを閉じます
	foreach($chList as $ch) {
		curl_multi_remove_handle($mh, $ch);
	}
	curl_multi_close($mh);

        // 結果が戻ります。
	return $returnList;
}

 

このコピペチェックツールでもAPIを実装して、curl_multiで並列処理をすることで少しでも早く実行できるようにしています。大体10並列くらいでバックグラウンド実装するようになっています。

参考にしてみてください。では。

megane

megane

最近、個人事業主から法人へと進化しました。 エンジニア歴13年位です。PHPとかMysqlを使ってWebシステムを構築します。 Javaも書きます。 CakePHPも使います。 サーバのチューニングもごりごりやります。 あと、お肉と自動車が好きです。Twitterとか申請どうぞ。

 - PHP , ,