ホームページ バックエンド開発 PHPチュートリアル phpcurlバッチ処理制御による同時実行性と非同期

phpcurlバッチ処理制御による同時実行性と非同期

Jun 13, 2016 pm 01:11 PM
curl multi while

PHP CURL バッチ処理 -- 制御可能な同時実行性と非同期
PHP マニュアルには次のコードがあります:

$mrc = curl_multi_init();
//发出请求
.......
$active = null;
		do {
		    $mrc = curl_multi_exec($mh, $active);
		} while ($mrc == CURLM_CALL_MULTI_PERFORM);
		
		while ($active && $mrc == CURLM_OK) {
		    if (curl_multi_select($mh) != -1) {
		        do {
		            $mrc = curl_multi_exec($mh, $active);
		        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
		    }
		}
//下面是处理请求返回的结果
ログイン後にコピー


この do...while は、$mrc に対するすべてのリクエストを完了してから実行するために使用されます。応答結果

しかし、リクエストが 1000 件ある場合、curl バッチ処理は同時に 1000 件のリクエストを行うことになります。これは明らかに不合理であるため、同時実行数を制御し、残りの接続をリクエスト キューに追加する必要があります。
参考: http://www.onlineaspect.com/2009/01/26/how-to-use-curl_multi-without-blocking/

  $mh = curl_multi_init();
        $ch = array();
        $chunck = 10; //并发控制数
        $all = count($urls);//所有的请求url数组
        $chunck = $all > $chunck ? $chunck : $all;
		
		$options = array(
			CURLOPT_HEADER=>FALSE,
			CURLOPT_RETURNTRANSFER=>TRUE,
			CURLOPT_FOLLOWLOCATION=>TRUE,
			CURLOPT_MAXREDIRS=>5,
			CURLOPT_USERAGENT=>'Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20100101 Firefox/6.0'
		);
		
		for($i = 0 ; $i < $chunck ; $i++){
			$ch[$i] = curl_init();
			curl_setopt($ch[$i],CURLOPT_URL,$urls[$i]);
			curl_setopt_array($ch[$i],$options);
			curl_multi_add_handle($mh,$ch[$i]);
		}
		
		do {
	        while(($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
	        if($execrun != CURLM_OK)break;
	        // a request was just completed -- find out which one
	        while($done = curl_multi_info_read($mh)) {
                //获取已经返回的url在urls数组里德的index
	            $index = array_search($done['handle'],$ch);
	            
	            $info = curl_getinfo($done['handle']);
	            
	            if ($info['http_code'] == 200){
	                $output = curl_multi_getcontent($ch[$index]);
	                // request successful.  process output using the callback function.
	                $save_path = $i.'.txt';//数据保存路径
					file_put_contents($save_path,$output);
	
	                // start a new request (it's important to do this before removing the old one)
	                $next = $i++;// increment i
	                $ch[$next] = curl_init();
	                $options[CURLOPT_URL] = $urls[$next];//将下一个请求添加到队列 
	                curl_setopt_array($ch[$next],$options);
	                curl_multi_add_handle($mh, $ch[$next]);
	
	                // remove the curl handle that just completed
	                curl_multi_remove_handle($mh, $done['handle']);
	            } else {
	                // request failed.  add error handling.
	            }
	        }
    	} while ($running);
		
		curl_multi_close($mh);
    
ログイン後にコピー


非常にうまく機能します使用後は副作用がなく、同時実行数を制御でき、さまざまな用途に使用できます。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PythonでCURLリクエストとPythonリクエストの相互変換を実現する方法 PythonでCURLリクエストとPythonリクエストの相互変換を実現する方法 May 03, 2023 pm 12:49 PM

curl と Pythonrequests は両方とも、HTTP リクエストを送信するための強力なツールです。 curl はターミナルから直接リクエストを送信できるコマンドライン ツールですが、Python のリクエスト ライブラリは、Python コードからリクエストを送信するためのよりプログラム的な方法を提供します。 curl を Pythonrequestscurl コマンドに変換するための基本的な構文は次のとおりです。curl[OPTIONS]URLcurl コマンドを Python リクエストに変換する場合、オプションと URL を Python コードに変換する必要があります。これは、curlPOST コマンドの例です:curl-XPOST https://example.com/api

C言語では、while(1)とwhile(0)の違いは何ですか? C言語では、while(1)とwhile(0)の違いは何ですか? Aug 31, 2023 am 10:45 AM

C 言語では、ループに渡された条件に基づいて動作するループを定義するために「while」キーワードが使用されることがわかっています。ここで、条件には true または false の 2 つの値を指定できるため、while ブロック内のコードは、条件が true の場合は繰り返し実行され、条件が false の場合は実行されません。さて、while ループにパラメータを渡すことで、while(1) と while(0) を区別できるようになります。while(1) は条件が常に true とみなされ、ブロック内のコードが繰り返し実行を開始するループであるためです。さらに、条件を true にするループに渡されるのは 1 ではないと言えますが、ゼロ以外の整数が while ループに渡された場合、それは true 条件とみなされます。

Linux での CURL バージョンの更新に関するチュートリアル! Linux での CURL バージョンの更新に関するチュートリアル! Mar 07, 2024 am 08:30 AM

Linux でカールのバージョンを更新するには、以下の手順に従います。 現在のカールのバージョンを確認します。 まず、現在のシステムにインストールされているカールのバージョンを確認する必要があります。ターミナルを開き、次のコマンドを実行します。curl --version このコマンドは、現在のcurlバージョン情報を表示します。利用可能なcurlのバージョンを確認する:curlを更新する前に、利用可能な最新バージョンを確認する必要があります。 Curl の公式 Web サイト (curl.haxx.se) または関連ソフトウェア ソースにアクセスして、curl の最新バージョンを見つけることができます。 Curl ソース コードをダウンロードする:curl またはブラウザを使用して、選択した CURL バージョンのソース コード ファイル (通常は .tar.gz または .tar.bz2) をダウンロードします。

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 Jul 08, 2023 pm 09:13 PM

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 最近、PHPは最新バージョンのPHP8.1を正式にリリースし、重要な機能である複数リクエストの同時処理のためのcurlを導入しました。この新機能により、開発者は複数の HTTP リクエストをより効率的かつ柔軟に処理できるようになり、パフォーマンスとユーザー エクスペリエンスが大幅に向上します。以前のバージョンでは、複数のリクエストを処理するには、多くの場合、複数の CURL リソースを作成し、ループを使用してデータをそれぞれ送受信する必要がありました。この方法でも目的は達成できますが、

最初から最後まで: PHP 拡張機能 cURL を使用して HTTP リクエストを行う方法 最初から最後まで: PHP 拡張機能 cURL を使用して HTTP リクエストを行う方法 Jul 29, 2023 pm 05:07 PM

最初から最後まで: HTTP リクエストに php 拡張機能 cURL を使用する方法 はじめに: Web 開発では、多くの場合、サードパーティ API または他のリモート サーバーと通信する必要があります。 cURL を使用して HTTP リクエストを行うのは、一般的で強力な方法です。この記事では、PHP を使用して cURL を拡張して HTTP リクエストを実行する方法を紹介し、いくつかの実用的なコード例を示します。 1. 準備 まず、php に cURL 拡張機能がインストールされていることを確認します。コマンドラインで php-m|grepcurl を実行して確認できます。

PHP Curl で Web ページの 301 リダイレクトを処理するにはどうすればよいですか? PHP Curl で Web ページの 301 リダイレクトを処理するにはどうすればよいですか? Mar 08, 2024 am 11:36 AM

PHPCurl で Web ページの 301 リダイレクトを処理するにはどうすればよいですか? PHPCurl を使用してネットワーク リクエストを送信すると、Web ページから返される 301 ステータス コードが頻繁に発生します。これは、ページが永続的にリダイレクトされたことを示します。この状況を正しく処理するには、いくつかの特定のオプションと処理ロジックを Curl リクエストに追加する必要があります。以下では、PHPCurl で Web ページの 301 リダイレクトを処理する方法を詳しく紹介し、具体的なコード例を示します。 301 リダイレクトの処理原則 301 リダイレクトとは、サーバーが 30 を返すことを意味します。

Linuxカールとは何ですか Linuxカールとは何ですか Apr 20, 2023 pm 05:05 PM

Linux では、curl はサーバーとの間でデータを転送するための非常に実用的なツールです。これは、コマンド ラインで動作する URL ルールを使用するファイル転送ツールです。ファイルのアップロードとダウンロードをサポートし、包括的な転送ツールです。 Curl は、プロキシ アクセス、ユーザー認証、ftp アップロードとダウンロード、HTTP POST、SSL 接続、Cookie サポート、ブレークポイント再開などの非常に便利な機能を多数提供します。

PHP CURLでCookieを設定する方法 PHP CURLでCookieを設定する方法 Sep 26, 2021 am 09:27 AM

PHP CURL で Cookie を設定する方法: 1. PHP サンプル ファイルを作成します; 2. "curl_setopt" 関数を通じて cURL 送信オプションを設定します; 3. CURL に Cookie を渡します。

See all articles