さらに、curl はリクエスト時間を設定できるため、非常に遅い URL リソースに遭遇した場合でも、リクエストをブロックすることがなくなります。比較的高い。
-
- /**
- *curl マルチスレッド
- * @param array $array 並列 URL
- * @param int $timeout タイムアウト時間
- * @return mix
- */
- public function Curl_http($array,$timeout='15'){
- $res = array();
-
- $mh =curl_multi_init();// 複数作成カールハンドル
-
- foreach($array as $k=>$url){
- $conn[$k]=curl_init($url);//初期化
-
- curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout );//タイムアウト期間を設定します
- curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (互換性; MSIE 5.01; Windows NT 5.0)');
- curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7 );//HTTPp 方向レベル、7 が最高です
- curl_setopt($conn[$k], CURLOPT_HEADER, false);//ここにヘッダーはありません。ブロック効率が向上します
- curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1) ; // 302 リダイレクト
- curl_setopt($conn[$k], CURLOPT_RETURNTRANSFER,1); //結果を文字列にして画面に出力する必要があります
- curl_setopt($conn[$k], CURLOPT_HTTPGET, true);
-
- curl_multi_add_handle ( $mh,$conn[$k]);
- }
- //無限ループによるCPUの消費を防ぐ
- do {
- $mrc =curl_multi_exec ($mh,$active);//データがない場合は active=true
- } while ($mrc == CURLM_CALL_MULTI_PERFORM);//データを受信している場合
- while ($active and $mrc == CURLM_OK ) {//データがない場合、またはリクエストが一時停止されている場合、active=true
- if (curl_multi_select($mh) != -1) {
- do {
- $mrc =curl_multi_exec($mh, $active);
- } while ($mrc == CURLM_CALL_MULTI_PERFORM);
- }
- }
-
- foreach ($array as $k => $url) {
- if(!curl_errno($conn[$k])){
- $data[ $k]=curl_multi_getcontent($conn[$k]);//データを配列に変換
- $header[$k]=curl_getinfo($conn[$k]);//httpヘッダー情報を返す
- curl_close($conn[ $k]);//ハンドルを閉じる
- curl_multi_remove_handle($mh, $conn[$k ]); //リソースを解放する
- }else{
- unset($k,$url);
- }
- }
-
- curl_multi_close( $mh);
-
- return $data;
-
- }
-
- //パラメータ受信
- $ callback = $_GET['callback'];
- $hrefs = $_GET['hrefs'];
- $urlarray =explode(' ,',trim($hrefs,','));
- $date = date(' Ymd',time());
- //インスタンス化
- $img = new HttpImg();
- $stime = $img-> ;getMicrotime();//開始時刻
-
- $data = $img->Curl_http ($urlarray,'20');//リストデータ
- mkdir('./img/'.$date,0777);
- foreach ((array)$data as $k=>$v){
- preg_match_all( "/(href|src)=(["|']?)([^ "'>]+.(jpg|png |PNG|JPG|gif))\2/i", $v, $matches[ $k]);
-
- if(count($matches[$k][3])>0){
- $dataimg = $img->Curl_http($matches[$k][3],'20' );//すべての画像データはバイナリ
- $j = 0;
- foreach ((array)$dataimg as $kk=>$vv ){
- if($vv !=''){
- $rand = rand(1000 ,9999);
- $basename = time()."_".$rand.".".jpg;// として保存jpg 形式のファイル
- $fname = './img/'.$date."/" ."$basename";
- file_put_contents($fname, $vv);
- $j++;
- echo "「.$j. "番目の写真"."$fname"."
";
- }else{
- unset($kk,$vv);
- }
- }
- }else{
- unset($matches);
- }
- }
- $etime = $img->getMicrotime();//終了時刻
- echo "Time".($etime-$stime)."Seconds";
- exit;
-
-
コードをコピー
|