以下は引用された内容です: // 2 つの cURL リソースを作成します $ch1 =curl_init(); $ch2 =curl_init(); ; // URL と適切なパラメータを指定します curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL , "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); // cURL バッチ ハンドルを作成します $mh =curl_multi_init(); // 前の 2 つのリソース ハンドルを追加します curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); // 状態変数を事前定義 $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); , $ ch2); curl_multi _close($mh);
ここで行う必要があるのは、複数の cURL ハンドルを開いてバッチ ハンドラーに割り当てることだけです。次に、while ループで完了するまで待つだけです。 この例には 2 つの主要なループがあります。最初の do-while ループは、curl_multi_exec() を繰り返し呼び出します。この関数はノンブロッキングですが、実行される回数は最小限に抑えられます。ステータス値を返します。この値が定数 CURLM_CALL_MULTI_PERFORM と等しい限り、実行すべき緊急の作業がまだあることを意味します (たとえば、URL に対応する http ヘッダー情報の送信)。つまり、戻り値が変わるまでこの関数を呼び出し続ける必要があります。 次の while ループは、$active 変数が true の場合にのみ続行されます。この変数は以前、curl_multi_exec() の 2 番目のパラメーターとして渡され、バッチ ハンドラーにまだアクティブな接続が存在するかどうかを表します。次に、curl_multi_select() を呼び出します。これは、アクティブな接続が発生する (サーバー応答の受信など) まで「ブロック」されます。この関数が正常に実行された後、別の do-while ループに入り、次の URL に進みます。 この機能を実際に使用する方法を見てみましょう: WordPress 接続チェッカー 大量の記事があるブログがあり、これらの記事には多数の外部 Web サイトのリンクが含まれていると想像してください。しばらくすると、何らかの理由で、これらのリンクのかなりの数が無効になりました。調和されているか、サイト全体がハッキングされているかのどちらかです... これらすべてのリンクを分析し、開けない Web サイトや Web ページ、または 404 が発生している Web サイト/Web ページを見つけて、レポートを生成するスクリプトを作成しましょう。 以下は実際に利用可能な WordPress プラグインではないことに注意してください。これはデモンストレーションのみを目的とした、独立した機能を備えた単なるスクリプトです。ありがとうございます。 さて、始めましょう。まず、データベースからこれらのリンクをすべて読み取ります: 以下は引用された内容です: // CONFIG $db_host = 'localhost' $db_pass = '; '; $db_name = 'wordpress'; $excluded_domains = array( 'localhost', 'www.mydomain.com'); $max_connections = 10; //いくつかの変数を初期化します $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $active = null; // MySQL に接続します if (!mysql_connect($db_host, $db_user, $db_pass )) { die('接続できませんでした: ' .mysql_error()); } if (!mysql_select_db($db_name)) { die('データベースを選択できませんでした: ' .mysql_error()); } // リンクのあるすべての記事を検索します $q = "wp_posts から post_content を選択します WHERE post_content LIKE '%href=%' AND post_status = 'publish' AND post_type = 'post'"; $r = mysql_query( $q ) または die(mysql_error()); while ($d = mysql_fetch_assoc($r)) { // 通常の一致するリンクを使用します if (preg_match_all("!href="(.*?)"!", $d ['post_content']、$ matches)){ 'host']、$ exclued_domains)){
} //重複リンクを削除します$ url_list = array_values(array_unique($ url_list)); ) { die('確認する URL がありません'); }
最初にデータベース、除外する一連のドメイン名 ($excluded_domains)、および同時接続の最大数 ($max_connections) を構成します。次に、データベースに接続し、記事と含まれるリンクを取得し、それらを配列 ($url_list) に収集します。 以下のコードは少し複雑なので、順を追って詳しく説明します: 以下は引用内容です:
// 1. バッチプロセッサ $mh =curl_multi_init(); // 2. バッチで処理する必要がある URL を追加 for ($i = 0; $i < $max_connections; $i++) { add_url_to_multi_handle ($ mh, $url_list); } // 3. 初期処理 do { $mrc =curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4 。 ️ // 9. デッドリンクですか? ] == 404){ }ハンドルを削除します。Curl_multi_remove_handle($ mh、$ mhinfo ['handle']); } } } } // 14. curl_multi_close($mh) ; echo "==Dead URLs==n"; echo implode("n",$dead_urls) が完了しました。 echo "==404 URLs==n"; echo implode("n",$ not_found_urls) . "nn"; echo "==Working URLs==n"; echo implode("n",$working_urls) ; // 15. バッチプロセッサにURLを追加 function add_url_to_multi_handle($mh, $ url_list) { static $index = 0; // URLが残っていたら無駄 if ($url_list[$index] ) { // 新しいカールハンドルを作成します $ch =curl_init(); Curl_Setopt ($ ch,curlopt_url, $ url_list [$ Index]);curl_multi_add_handle($mh, $ch); // 次回この関数を呼び出すときに、次の URL を追加できます $index++; return false; } } 下面解释一下以上の代金。リスト内のシリアル番号は、コード コメント内の連続番号に対応します。 | 新しいバッチプロセッサを作成します。マルチハンドルを作成しました。後でバッチ ハンドラーに URL を追加する関数 add_url_to_multi_handle() を作成します。この関数が呼び出されるたびに、新しい URL がバッチ プロセッサに追加されます。最初に、10 個の URL をバッチ プロセッサに追加します (この数は $max_connections によって決まります)。 初期化作業を行うには、curl_multi_exec() を実行する必要があります。CURLM_CALL_MULTI_PERFORM が返される限り、まだやるべきことが残っています。これは主に接続を作成するために行われ、完全な URL 応答を待ちません。 メイン ループは、バッチ内にアクティブな接続がある限り継続します。 curl_multi_select() は、URL クエリの結果、アクティブな接続が確立されるまで待機します。 cURL の役割は、主に応答データを取得することです。 さまざまな情報を確認してください。 URL リクエストが完了すると、配列が返されます。 返された配列には cURL ハンドルがあります。これを使用して、単一の cURL リクエストに対応する情報を取得します。 これがデッドリンクであるか、リクエストがタイムアウトした場合、http ステータス コードは返されません。 このページが見つからない場合は、404 ステータス コードが返されます。 それ以外の場合は、このリンクが利用可能であると想定します (もちろん、500 エラーなどを確認することもできます...)。 この cURL ハンドルはもう使用されないのでバッチから削除し、閉じてください。 わかりました。別の URL を追加できるようになりました。再び初期化作業が始まります... さて、やるべきことはすべて完了しました。バッチ プロセッサを閉じて、レポートを生成します。 新しい URL をバッチ プロセッサに追加する関数に戻りましょう。この関数が呼び出されるたびに、静的変数 $index がインクリメントされるため、処理すべき URL がいくつ残っているかがわかります。 このスクリプトを自分のブログで実行しました (テストの必要があり、いくつかの間違ったリンクが意図的に追加されました)、結果は次のとおりです: 以下は引用された内容です: 合計約 40 の URL がチェックされます。これには 2 秒もかかりません。より多くの URL をチェックする必要がある場合、その心配を軽減する効果は想像できます。 10 個の接続を同時に開くと、速度は 10 倍になります。さらに、cURL バッチ処理のノンブロッキング機能を利用して、Web スクリプトをブロックせずに大量の URL リクエストを処理することもできます。 | その他の便利な cURL オプション HTTP 認証 URL リクエストに HTTP ベースの認証が必要な場合は、次のコードを使用できます: コンテンツをクリップボード コードにコピーします: 以下は引用されたコンテンツです: $url = "http://www.somesite.com/members/";$ch =curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1) ;// ユーザー名とパスワードを送信します curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // リダイレクトを許可できます curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 次のオプションを使用すると、リダイレクト後にユーザー名とパスワードを送信する cURL // curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output =curl_exec($ch); curl_close($ch); FTP アップロード | PHP が来ます独自の FTP クラス ライブラリを使用しますが、cURL を使用することもできます: 以下は引用された内容です: //ファイル ポインターを開く$file = fopen("/path /to/file" , "r"); // URL には必要な情報のほとんどが含まれています $url = "ftp://username:password@mydomain.com:21/path/to/new/file" ;$ch =curl_init (); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //アップロード関連オプション curl_setopt($ch, CURLOPT_UPLOAD, 1); , $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); // ASCII モードを有効にするかどうか (テキスト ファイルをアップロードするときに便利です) curl_setopt( $ch, CURLOPT_FTPASCII, 1 ); $output =curl_exec($ch); curl_close($ch);
*** テクニック プロキシを使用して cURL リクエストを開始できます: 以下は引用された内容です: $ch =curl_init(); curl_setopt($ch, CURLOPT_URL,'http: //www.example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // プロキシアドレスを指定します curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080'); // 必要に応じて、ユーザー名とパスワードを指定します curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass'); $output =curl_exec($ch); curl_close ($ch); | コールバック関数 を使用できますURL リクエスト中に、cURL が指定されたコールバック関数を呼び出すようにします。たとえば、コンテンツまたは応答がダウンロードされたら、完全にダウンロードされるまで待つのではなく、すぐにデータの利用を開始します。 以下は引用内容です: $ch =curl_init(); curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com'); curl_setopt($ch, CURLOPT_WRITEFUNCTION, " progress_function"); curl_exec($ch); curl_close ($ch); function progress_function($ch,$str) { echo $str; return strlen($str); } | this コールバック関数は文字列の長さを返す必要があります。そうでない場合、この関数は正しく動作しません。 URL 応答を受信する過程で、データ パケットが受信されている限り、この関数が呼び出されます。 まとめ 今日は、cURL ライブラリの強力な機能と柔軟な拡張性について学びました。気に入っていただければ幸いです。次回 URL リクエストを行う場合は、cURL を検討してください。 原文: PHPベースのcURLでクイックスタート
|
|
|