コード例はFuelPHP用ですが、
コピって、namespace消すだけで、
別にどこでも利用可能かと。
staticにしてもいいと思う。
使い方
「CURLOPT_RETURNTRANSFER」だけはデフォで設定してあるので、
オプションで指定しなくても、クロール先を出力してくれます。
例
$curl = new My_Curl();
$array_options = array(
CURLOPT_FAILONERROR => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 10,
);
$output= $curl->get_single($url, $array_options);
クラスのコード
コード
<?php
namespace Lib;
Class My_Curl {
/**
* シングルプロセスCURL
*
* @param string $str_url
* <br />処理対象URL
* @param array $array_options
* <br />CURLにセットするオプションと値のセット
* <br />
* <br />例) array(CURLOPT_RETURNTRANSFER => 1)
* @return $str_result
*/
public function get_single($str_url, $array_options) {
$ch = curl_init($str_url);
$this->set_options($ch, $array_options);
$str_result = curl_exec($ch);
curl_close($ch);
return $str_result;
}
/**
* 並列処理CURL
*
* @param array $array_urls
* <br />処理対象URLリスト
* @param array $array_options
* <br />CURLにセットするオプションと値のセット
* <br />
* <br />例) array(CURLOPT_RETURNTRANSFER => 1)
* @return $array_res
* <br />結果。$array_urlsと同じキーで格納。
*/
public function get_multi($array_urls, $array_options) {
$mh = curl_multi_init(); //並列用ハンドル作成
$ch = array();
foreach($array_urls as $key => $str_url) {
//ハンドル作成
$ch[$key] = curl_init($str_url);
//CURLオプション設定
$this->set_options($ch[$key], $array_options);
//並列用ハンドルに、各ハンドルをセット
curl_multi_add_handle($mh, $ch[$key]);
}
//並列処理開始
$still_running = null;
do {
$mrc = curl_multi_exec($mh, $still_running);
} while($still_running);
//レスポンス待ち
while($still_running && $mrc == CURLM_OK) {
if(curl_multi_select($mh, 10) != -1) {
//状態更新
do {
$mrc = curl_multi_exec($mh, $still_running);
} while($still_running);
} else {}
}
$array_res = array(); //返却値を配列で格納
foreach($array_urls as $key => $str_url) {
//エラーが存在しない場合(正常時)
if(curl_errno($ch[$key]) == '') {
//結果取得
$array_res[$key] = curl_multi_getcontent($ch[$key]);
}
//エラー
else {
$array_res[$key] = null;
}
//ハンドル後処理
curl_multi_remove_handle($mh, $ch[$key]);
curl_close($ch[$key]);
}
//並列用ハンドル削除
curl_multi_close($mh);
return $array_res;
}
/**
* CURLオプションの設定
*
* @param resource $ch
* <br />curlハンドル
* @param array $array_options
* <br />CURLにセットするオプションと値のセット
* <br />
* <br />例) array(CURLOPT_RETURNTRANSFER => 1)
*/
private function set_options($ch, $array_options) {
//固定CURLオプション設定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//動的CURLオプション設定
foreach($array_options as $int_option => $multi_val) {
curl_setopt($ch, $int_option, $multi_val);
}
return $ch;
}
}