PHP 関数 CURL

WBOY
リリース: 2016-06-23 14:31:00
オリジナル
738 人が閲覧しました

cURL は、URL 構文を使用してファイルやデータを転送するツールです。HTTP、FTP、TELNET などの多くのプロトコルをサポートしています。最も優れた点は、PHP が cURL ライブラリもサポートしていることです。この記事では、cURL の高度な機能と、それを PHP で使用する方法を紹介します。

なぜ cURL を使用するのですか?

はい、他の方法で Web コンテンツを取得できます。ほとんどの場合、私は怠惰になりたいので、単純な PHP 関数を使用するだけです。

以下は引用されたコンテンツです:

$content = file_get_contents("http://www.nettuts.com") ;
/ / or
$lines = file("http://www.nettuts.com");
// or
readfile(http://www.nettuts.com);

ただし、これはこのアプローチには柔軟性と効率的なエラー処理が欠けています。さらに、Cookie の処理、検証、フォームの送信、ファイルのアップロードなど、一部の難しいタスクを完了するために使用することはできません。

引用:
cURL は、さまざまなプロトコルとオプションをサポートし、URL リクエストに関連するさまざまな詳細を提供できる強力なライブラリです。

基本構造

より複雑な関数を学ぶ前に、PHP で cURL リクエストを確立するための基本的な手順を見てみましょう:

設定変数を初期化して実行し、結果を取得して cURL ハンドルを解放します

以下は引用された内容:

// 1. 初期化
$ch =curl_init();
// 2. URL などのオプションを設定
curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com");
curl_setopt($ ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. HTML ドキュメントを実行してコンテンツを取得します
$output =curl_exec($ch);
// 4 .curl ハンドルを解放します
curl_close( $ch);

2 番目のステップ (つまり、curl_setopt()) が最も重要であり、すべての謎がここにあります。 URL リクエストのさまざまな詳細を指定する、設定できる cURL パラメーターの長いリストがあります。これらをすべて一度に読んで理解するのは難しい場合があるため、今日はより一般的で便利なオプションのみを試します。

エラーをチェックする

エラーをチェックするステートメントを追加できます(これは必須ではありません):

以下は引用された内容です:

// ...
$output =curl_exec($ ch) ;
if ($output === FALSE) {
echo "cURL Error: " .curl_error($ch);
}
// ...

比較するときは、" を使用することに注意してください。 「== FALSE」ではなく「=== FALSE」です。空の出力とブール値 FALSE (実際のエラー) を区別する必要があるためです。

情報の取得

これは、cURL の実行後にこのリクエストに関する情報を取得できる別のオプションの設定です:

返される配列には次の情報が含まれます:

"url" //リソースネットワークアドレス "content_type" //コンテンツエンコーディング "http_code" //HTTP ステータスコード "header_size" //ヘッダーサイズ "request_size" //リクエストサイズ "filetime" //ファイル作成時間 "ssl_verify_result" //SSL検証結果 "redirect_count" //ジャンプテクノロジー "total_time" //かかった合計時間 "namelookup_time" //DNSクエリ時間 "connect_time" //接続待機時間 "pretransfer_time" //送信までの準備時間 "size_upload" //アップロードデータのサイズ "size_download" //ダウンロードデータのサイズ "speed_download" //ダウンロード速度 "speed_upload" //アップロード速度 "download_content_length" //ダウンロードコンテンツの長さ "upload_content_length" //アップロードされたコンテンツの長さ "starttransfer_time" //転送を開始する時間 "redirect_time" //リダイレクトには

ブラウザベースのリダイレクト

がかかります

最初の例では、サーバーにブラウザがあるかどうかを検出するコードの段落を提供します-ベースのリダイレクト。たとえば、一部の Web サイトは、モバイル ブラウザであるかどうか、さらにはユーザーの出身国に基づいて Web ページをリダイレクトします。

CURLOPT_HTTPHEADER オプションを使用して、ユーザー エージェント情報やデフォルト言語など、送信する HTTP リクエスト ヘッダー (http ヘッダー) を設定します。次に、これらの特定の Web サイトが別の URL にリダイレクトするかどうかを確認します。

以下は引用された内容です:

// ...
curl_exec( $ch);
$info =curl_getinfo($ch);
echo 'Get'。$info['url'] '時間がかかります'。$info['total_time'] .. .

以下、引用内容です

// 検索用の URL
$urls = array(
"http://www.cnn.com",
"http://www.mozilla.com",
" http://www.facebook.com "
);
// 测试用浏览器情報
$browsers = array(
"standard" => array (
"user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-米国; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
"言語" => "en-us,en;q=0.5"
),
"iphone " => array (
"user_agent" => "Mozilla/5.0 (iPhone; U; Mac OS X のような CPU; en) AppleWebKit/420+ (Gecko のような KHTML) バージョン/3.0 Mobile/1A537a Safari/419.3" ,
"言語" => "en"
),
"フランス語" => array (
"user_agent" => "Mozilla/4.0 (互換性; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0) .50727)",
" language" => "fr,fr-FR;q=0.5"
)
);
foreach ($urls as $url) {
echo "URL: $urln";
foreach ( $browsers as $test_name => $browser) {
$ch =curl_init();
// urlを設定します
curl_setopt($ch, CURLOPT_URL, $url);
// ブラウザの特定のヘッダを設定します
curl_setopt($ ch, CURLOPT_HTTPHEADER, array(
"ユーザーエージェント: {$browser['user_agent']}",
"Accept-Language: {$browser['言語']}"
));
// 页面内容我们并不要
curl_setopt($ch, CURLOPT_NOBODY, 1);
// HTTP ヘッダーを返すだけ必要です
curl_setopt($ch, CURLOPT_HEADER, 1);
// 返結果、出它
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output =curl_exec($ch);
curl_close($ch);
// 重定方向のHTTP头情報吗?
if (preg_match("!Location: (.*)!", $output 、$matches)) {
echo "$test_name: $matches[1]n";
} else {
echo "$test_name: no redirectionn";
}
}
echo "nn";
}

まず、テストする必要がある URL のセットを作成し、次にテストする必要があるブラウザー情報のセットを指定します。最後に、ループを使用して、発生する可能性のあるさまざまな URL とブラウザーの一致状況をテストします。

cURL オプションを指定したため、返される出力コンテンツには HTTP ヘッダー情報 ($output に保存される) のみが含まれます。単純な規則ルールを使用して、ヘッダー情報に「Location:」という単語が含まれているかどうかを確認します。

このコードを実行すると、次の結果が返されるはずです:

POST メソッドを使用したデータの送信

GET リクエストを行う場合、データは「クエリ文字列」を介して URL に渡すことができます。たとえば、Google で検索する場合、検索キーは URL のクエリ文字列の一部です:

http://www.google.com/search?q=nettuts

この場合、シミュレーションに cURL は必要ない可能性があります。 。この URL を「file_get_contents()」にスローすると、同じ結果が得られます。

ただし、一部の HTML フォームは POST メソッドを使用して送信されます。このフォームが送信されると、データはクエリ文字列ではなく HTTP リクエスト本文を通じて送信されます。たとえば、CodeIgniter フォーラム フォームを使用する場合、どのようなキーワードを入力しても、常に次のページに POST されます:

http://codeigniter.com/forums/do_search/

PHP スクリプトを使用して、この URL の質問をシミュレートします。まず、POST データを受け入れて表示できる新しいファイルを作成します。post_output.php という名前を付けます。次に、cURL リクエストを実行する PHP スクリプトを作成します。以下は引用された内容です:

$url = "http://localhost/post_output.php";

$post_data = array (

"foo" => "bar",

"query" => "Nettuts " ,

"action" => "送信"

);$ch =curl_init();curl_setopt($ch, CURLOPT_URL, $url); ファイルのアップロードは、前の POST と非常に似ています。すべてのファイル アップロード フォームは POST メソッドを通じて送信されるためです。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// us In POSTデータです!

curl_setopt($ch, CURLOPT_POST, 1);

//post 変数を
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output =curl_exec($ch);
curl_close($ch);
echo に追加します$output;




コードを実行すると、次の結果が得られます:



このスクリプトは、POST リクエストを post_output.php に送信し、このページの $_POST 変数を返し、cURL を使用してこの出力をキャプチャします。 。

ファイルのアップロード

まず、upload_output.php という名前で、ファイルを受信するための新しいページを作成します:

print_r($_FILES);

以下は、実際にファイルアップロードタスクを実行するスクリプトです:

以下は引用内容:

$url = "http://localhost/upload_output.php";

$post_data = array (

"foo" => "bar",

// アップロードするローカルファイルのアドレス

"upload" => " @C:/wamp/www/test.zip"

);$ch =curl_init();curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);

$output =curl_exec($ch);
curl_close($ch);
echo $output;



ファイルをアップロードする必要がある場合は、post 変数のようにファイル パスを渡すだけですが、先頭に @ 記号を追加することを忘れないでください。このスクリプトを実行すると、次の出力が得られます:

cURL バッチ処理 (マルチ cURL)

cURL には、バッチ ハンドル (ハンドル) という高度な機能もあります。この機能を使用すると、複数の URL 接続を同時にまたは非同期で開くことができます。

以下は php.net のサンプルコードです:

以下は引用された内容です:

// 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) に収集します。

以下のコードは少し複雑なので、順を追って詳しく説明します:

新しいバッチプロセッサを作成します。マルチハンドルを作成しました。後でバッチ ハンドラーに 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 がいくつ残っているかがわかります。 このスクリプトを自分のブログで実行しました (テストの必要があり、いくつかの間違ったリンクが意図的に追加されました)、結果は次のとおりです:

以下は引用内容です:

// 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;
}
}


下面解释一下以上の代金。リスト内のシリアル番号は、コード コメント内の連続番号に対応します。

以下は引用された内容です: その他の便利な cURL オプション

合計約 40 の URL がチェックされます。これには 2 秒もかかりません。より多くの URL をチェックする必要がある場合、その心配を軽減する効果は想像できます。 10 個の接続を同時に開くと、速度は 10 倍になります。さらに、cURL バッチ処理のノンブロッキング機能を利用して、Web スクリプトをブロックせずに大量の URL リクエストを処理することもできます。

HTTP 認証

URL リクエストに HTTP ベースの認証が必要な場合は、次のコードを使用できます:

コンテンツをクリップボード コードにコピーします:


以下は引用されたコンテンツです: $url = "http://www.somesite.com/members/";PHP が来ます独自の FTP クラス ライブラリを使用しますが、cURL を使用することもできます:
$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 アップロード

以下は引用された内容です: //ファイル ポインターを開く
$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でクイックスタート


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート