phpのcurl使用入門チュートリアルと一般的な使用例-上
要約: [ディレクトリ]phpのcurl使用入門チュートリアルと一般的な使用例1、curlの優位性2、curlの簡単な使用手順3、エラー処理4、curl要求の具体的な情報5、curlを使用してpost要求6、ファイルアップロード7、ファイルダウンロード8、http検証9、プロキシ送信要求10、jsonデータ11の送信、cURLバッチの送信(multi cURL)十二、まとめてみると、まずcURLはコマンドラインツールとして設計されていますが、幸いなことにphpもcURLをサポートしています.
最初はcURLはコマンドラインツールとして設計されていましたが、幸いphpもcURLをサポートしています.cURLという利器により、phpプログラムでHTTPリクエストをurlに自由に送信してデータを取得または提出することができ、FTP、Telnet、SMTPなど、他の多くのプロトコルをサポートすることができます.このブログでは、phpでどのようにcURLを使用していくつかのことを処理するかを簡単に説明します.
一、curlの優位性
phpでurlの内容を簡単に入手できるかもしれませんが、file_を通過すればget_contents、fileまたはreadfile関数は簡単に実現でき、cURLを使用する必要はありません.
そうですね.以上の関数は場合によっては便利ですが、これらの関数は柔軟ではなく、エラー処理もできないと思います.また,phpプログラムであるサーバにフォームデータをコミットし,ファイルをアップロードし,cookiesや認証などのタスクを処理する場合,以上の3つの関数はまったく適切ではない.この時、cURLはその価値を体現しています.
cURlは多くのネットワークプロトコルをサポートするだけでなく、urlリクエストに関する具体的な情報を提供しています.
二、curlの簡単な使用手順
cURLを使用してurlリクエストを送信するには、次の4つのステップに大別します.
1.初期化2.要求オプションの設定3.cURLセッションを実行し、関連する返信を取得4.cURLハンドルを解放し、cURLセッションを閉じる
cURLが強いのは、第2のステップに現れているからです.curlを通ってsetoptは柔軟にリクエストオプションを設定します.この中には多くのオプションがあります.具体的には、以下の参考にしてください.http://cn2.php.net/manual/zh/function.curl-setopt.php
三、エラー処理
上記のコードでは、エラー処理のコードを追加することもできます.
なお、上記の判断には
四、curl要求の具体的な情報を取得する
cURLリクエストを実行するとcurl_を使用することもできます.getinfoは、リクエストの詳細を取得します.
上記$curl_infoは関連配列であり、そこから多くの具体的な要求情報を取得することができる.リファレンスhttp://cn2.php.net/manual/zh/function.curl-getinfo.php
五、curlを用いてpost要求を送信する
前述したように,あるurlにgetリクエストを送信する場合,cURLを用いてgetリクエストを送信する必要はなく,比較的便利な
次に、cURLを使用してpostリクエストをpost.phpスクリプトに送信し、post.phpにいくつかのデータをコミットし、post.phpにpostリクエストのデータを出力するシミュレーションを行います.サンプルコードは次のとおりです.
ご覧のように、cURLはpostリクエストをpost.phpに正常に送信し、いくつかのデータを送信し、post.phpからの応答を受信し、最後に応答を出力します.前例は簡単ですが、cURLでpostリクエストを送信する便利さと強さを十分に示しています.curl_setoptで文章を作る.
六、ファイルアップロード
以下、cURLでpostリクエストを送信するとファイルアップロードが実現します.PHPの下に深く入り込んだファイルアップロードのファイルアップロードの例を示しますが、phpの下に深く入り込んだファイルアップロードでは、フォームの提出によってファイルアップロードが実現されますが、cURLではどのように実現されますか?
このように、cURLでファイルをアップロードする場合は、アップロードしたファイルパスをpostデータとしてcurlリクエストに設定し、パスの前に@を付けるだけです.
七、ファイルのダウンロード
上記のようにファイルをアップロードし、curlを使用してファイルのダウンロードや保存を自動的に完了することもできます.補足ですが、curlリクエストを実行するときに、返されたコンテンツを直接出力するのではなく、返されたコンテンツを取得する必要がある場合は、curlのデフォルトが出力リクエストの返信内容であるため、次のコード設定を使用することを忘れないでください.
52 fhyのサーバルートディレクトリの下にtest.zipファイルがある場合は、ダウンロードしてローカルファイルに保存する必要があります.次のコードを使用して実装してみます.
注意:私は以上エラー処理のコードを省略しましたが、簡単に例を挙げます.実際には、
上記のコードは、ファイルをメモリに読み込み、すべての内容が読み込まれてからローカルハードディスク(HDD)に書き込む必要があるため、比較的大きなファイルをダウンロードする場合には適用されません.phpに設定されたmemory limitが非常に大きくても,この場合の性能への影響は大きい.だから、私たちは大規模なファイルのダウンロードに対して、curlにこの任務を引き継いで、ダウンロードしながら、書き込みの処理を実現させるべきで、このようにすれば、問題はありません.次のコードを参照してください.
上記のコードでは、まずローカルファイルを開き、ファイルハンドルをcurlに設定し、curlにリモートデータを読み出しながらローカルファイルに書き込むようにします.プログラムでリモート返信の内容を取得する必要はありませんので、リクエストを実行すればいいです.
八、http検証
サーバ側が要求を検証する必要がある場合は、サンプルコードと同様にして実装できます.
九、代理を通じて要求を送る
cURLは、プロキシサーバを介してリクエストを送信することもできます.サンプルコードを参照してください.
十、jsonデータの送信
最後に,cURLを介してサーバ側にjsonデータを送信したいと考える.具体的なコードは以下の通りです.
上記のコードで受け入れられるjson文字列は、次のとおりです.
経由json_decode以降はphpのデータフォーマットに変換されて1つのオブジェクトとなるので、
次のphp配列でjson文字列を生成すると、
上記のjson文字列はjson_を経由していますdecode処理後、phpの配列フォーマットになり、emailを取得するには
十一、cURLバッチ(multi cURL)
cURLにはバッチハンドル(handle)という高度な特性もあります.この機能により、複数のURL接続を同時にまたは非同期で開くことができます.
php.netからのコードの例を次に示します.
ここでは、複数のcURLハンドルを開き、バッチハンドルに割り当てることです.その後、whileサイクルで実行が完了するのを待つだけです.
この例には2つの主要なループがあります.最初のdo-whileループ繰り返し呼び出し
次のwhileサイクルは
十二、まとめ
このブログでは、いくつかのcURLの用途を列挙しただけで、サンプルコードは比較的簡単です.しかし、あなたが見終わったらcURLを使う衝動があると信じています.では、自分で関連資料を探して、マニュアルをテストしましょう.
さあ、ここまでにしましょう.辛抱強く読んでくれてありがとう!
添付:
[ ]
php curl
、curl
、curl
、
、 curl
、 curl post
、
、
、http
、
、 json
、cURL (multi cURL)
、
最初はcURLはコマンドラインツールとして設計されていましたが、幸いphpもcURLをサポートしています.cURLという利器により、phpプログラムでHTTPリクエストをurlに自由に送信してデータを取得または提出することができ、FTP、Telnet、SMTPなど、他の多くのプロトコルをサポートすることができます.このブログでは、phpでどのようにcURLを使用していくつかのことを処理するかを簡単に説明します.
一、curlの優位性
phpでurlの内容を簡単に入手できるかもしれませんが、file_を通過すればget_contents、fileまたはreadfile関数は簡単に実現でき、cURLを使用する必要はありません.
$content = file_get_contents("http://www.52fhy.com");
$lines = file("http://www.52fhy.com");
readfile("http://www.52fhy.com");
そうですね.以上の関数は場合によっては便利ですが、これらの関数は柔軟ではなく、エラー処理もできないと思います.また,phpプログラムであるサーバにフォームデータをコミットし,ファイルをアップロードし,cookiesや認証などのタスクを処理する場合,以上の3つの関数はまったく適切ではない.この時、cURLはその価値を体現しています.
cURlは多くのネットワークプロトコルをサポートするだけでなく、urlリクエストに関する具体的な情報を提供しています.
二、curlの簡単な使用手順
cURLを使用してurlリクエストを送信するには、次の4つのステップに大別します.
1.初期化2.要求オプションの設定3.cURLセッションを実行し、関連する返信を取得4.cURLハンドルを解放し、cURLセッションを閉じる
// 1. cURL
$ch = curl_init();
// 2. , url
curl_setopt($ch, CURLOPT_URL, "http://www.52fhy.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. cURL
$response = curl_exec($ch);
// 4. cURL , cURL
curl_close($ch);
cURLが強いのは、第2のステップに現れているからです.curlを通ってsetoptは柔軟にリクエストオプションを設定します.この中には多くのオプションがあります.具体的には、以下の参考にしてください.http://cn2.php.net/manual/zh/function.curl-setopt.php
三、エラー処理
上記のコードでは、エラー処理のコードを追加することもできます.
$response = curl_exec($ch);
if ($response === FALSE) {
echo "cURL : " . curl_error($ch);
}
なお、上記の判断には
===
を使用する必要があります.要求の返信は空の文字列であり、curlは要求エラーの場合にFALSE値を返すため、===
ではなく==
を使用する必要があります.四、curl要求の具体的な情報を取得する
cURLリクエストを実行するとcurl_を使用することもできます.getinfoは、リクエストの詳細を取得します.
curl_exec($ch);
$curl_info= curl_getinfo($ch);
echo " http code : {$curl_info['http_code']}";
上記$curl_infoは関連配列であり、そこから多くの具体的な要求情報を取得することができる.リファレンスhttp://cn2.php.net/manual/zh/function.curl-getinfo.php
五、curlを用いてpost要求を送信する
前述したように,あるurlにgetリクエストを送信する場合,cURLを用いてgetリクエストを送信する必要はなく,比較的便利な
file_get_contents
関数を用いてリクエストを完了することができる.しかし、一般的に、urlパラメータではなくpostリクエストのコンテンツ領域でデータをコミットするフォームをコミットする場合、柔軟なcURLを使用してpostリクエストの送信をシミュレートする必要があります.次に、cURLを使用してpostリクエストをpost.phpスクリプトに送信し、post.phpにいくつかのデータをコミットし、post.phpにpostリクエストのデータを出力するシミュレーションを行います.サンプルコードは次のとおりです.
$url = "http://www.52fhy.me/post.php";
$post_data = array (
"blog_name" => "52fhy",
"blog_url" => "http://www.52fhy.com",
"action" => "Submit"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post
curl_setopt($ch, CURLOPT_POST, 1);
// post
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// post ,
$response= curl_exec($ch);
curl_close($ch);
echo $response;
以上のリクエストがpost.phpに送信された後print_r($_POST)が出力されると、上記のサンプルコードから次のような返信が出力されます.Array
(
[blog_name] => 52fhy
[blog_url] => http://www.52fhy.com
[action] => Submit
)
ご覧のように、cURLはpostリクエストをpost.phpに正常に送信し、いくつかのデータを送信し、post.phpからの応答を受信し、最後に応答を出力します.前例は簡単ですが、cURLでpostリクエストを送信する便利さと強さを十分に示しています.curl_setoptで文章を作る.
六、ファイルアップロード
以下、cURLでpostリクエストを送信するとファイルアップロードが実現します.PHPの下に深く入り込んだファイルアップロードのファイルアップロードの例を示しますが、phpの下に深く入り込んだファイルアップロードでは、フォームの提出によってファイルアップロードが実現されますが、cURLではどのように実現されますか?
$url = "http://www.52fhy.me/upload.php";
$post_data = array (
"attachment" => "@E:/jackblog/boy.jpg"
);
// cURL
$ch = curl_init();
// url
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post
curl_setopt($ch, CURLOPT_POST, 1);
// post
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$response = curl_exec($ch);
curl_close($ch);
print_r($response);
上記のサンプルコードにより、ローカルマシン上のboy.jpgをローカルサーバのupload.phpにアップロードすることができ、upload.phpでアップロードされた具体的な情報を出力すると、上記のサンプルコードの最後の出力の返事は以下の通りである.Array
(
[attachment] => Array
(
[name] => boy.jpg
[type] => application/octet-stream
[tmp_name] => D:\xampp\tmp\phpF27D.tmp
[error] => 0
[size] => 11490
)
)
このように、cURLでファイルをアップロードする場合は、アップロードしたファイルパスをpostデータとしてcurlリクエストに設定し、パスの前に@を付けるだけです.
七、ファイルのダウンロード
上記のようにファイルをアップロードし、curlを使用してファイルのダウンロードや保存を自動的に完了することもできます.補足ですが、curlリクエストを実行するときに、返されたコンテンツを直接出力するのではなく、返されたコンテンツを取得する必要がある場合は、curlのデフォルトが出力リクエストの返信内容であるため、次のコード設定を使用することを忘れないでください.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
52 fhyのサーバルートディレクトリの下にtest.zipファイルがある場合は、ダウンロードしてローカルファイルに保存する必要があります.次のコードを使用して実装してみます.
// url
$url = 'http://www.52fhy.com/test.zip';
//
$path = 'local/path/to/test.zip';
// , , ,
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
//
file_put_contents($path, $data);
注意:私は以上エラー処理のコードを省略しましたが、簡単に例を挙げます.実際には、
curl_getinfo
関数でエラー処理を行う必要があります.上記のコードは、ファイルをメモリに読み込み、すべての内容が読み込まれてからローカルハードディスク(HDD)に書き込む必要があるため、比較的大きなファイルをダウンロードする場合には適用されません.phpに設定されたmemory limitが非常に大きくても,この場合の性能への影響は大きい.だから、私たちは大規模なファイルのダウンロードに対して、curlにこの任務を引き継いで、ダウンロードしながら、書き込みの処理を実現させるべきで、このようにすれば、問題はありません.次のコードを参照してください.
$url = 'http://www.52fhy.com/test.zip';
$path = 'local/path/to/test.zip';
//
$fp = fopen($path, 'w');
// curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
上記のコードでは、まずローカルファイルを開き、ファイルハンドルをcurlに設定し、curlにリモートデータを読み出しながらローカルファイルに書き込むようにします.プログラムでリモート返信の内容を取得する必要はありませんので、リクエストを実行すればいいです.
八、http検証
サーバ側が要求を検証する必要がある場合は、サンプルコードと同様にして実装できます.
$url = "http://www.52fhy.com/users/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
//
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
$response = curl_exec($ch);
curl_close($ch);
九、代理を通じて要求を送る
cURLは、プロキシサーバを介してリクエストを送信することもできます.サンプルコードを参照してください.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://www.52fhy.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// ip
curl_setopt($ch, CURLOPT_PROXY, '222.73.173.50:8080');
// ,
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'username:password');
$response = curl_exec($ch);
curl_close ($ch);
十、jsonデータの送信
最後に,cURLを介してサーバ側にjsonデータを送信したいと考える.具体的なコードは以下の通りです.
$url = 'http://www.52fhy.me/json.php';
// json
$data = array('site' => '52fhy', 'url' => 'http://www.52fhy.com','email'=>'[email protected]');
$json_string = json_encode($data);
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post json
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, array('data'=>$json_string));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
ご覧のように、上記のリクエストは私のローカルサーバに送信されたjson.phpの下で、私はこのファイルでjson_を使用しています.decodeは、受信したjson文字列をオブジェクトに変換し、次のコードでemailフィールドを出力します.$json_data = json_decode($_POST['data']);
echo $json_data->email;
上記のコードで受け入れられるjson文字列は、次のとおりです.
'{"site":"52fhy","url":"http:\/\/www.52fhy.com","email":"[email protected]"}'
経由json_decode以降はphpのデータフォーマットに変換されて1つのオブジェクトとなるので、
$json_data->email
でemailフィールドの値、最後に出力にアクセスできます[email protected].上記のコードを使ってテストしてもいいです.次のphp配列でjson文字列を生成すると、
$data = array('52fhy', 'http://www.52fhy.com', '[email protected]');
で生成されたjson文字列は、次のとおりです.'["52fhy","http:\/\/www.52fhy.com","[email protected]"]'
上記のjson文字列はjson_を経由していますdecode処理後、phpの配列フォーマットになり、emailを取得するには
$json_data[2]
でアクセスできます.十一、cURLバッチ(multi cURL)
cURLにはバッチハンドル(handle)という高度な特性もあります.この機能により、複数のURL接続を同時にまたは非同期で開くことができます.
php.netからのコードの例を次に示します.
// 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();
//
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);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
//
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
ここでは、複数のcURLハンドルを開き、バッチハンドルに割り当てることです.その後、whileサイクルで実行が完了するのを待つだけです.
この例には2つの主要なループがあります.最初のdo-whileループ繰り返し呼び出し
curl_multi_exec()
.この関数は無遮断(non-blocking)ですが、できるだけ少なく実行されます.この値が定数に等しい限り、ステータス値を返します. CURLM_CALL_MULTI_PERFORM
,代表としては、まだ一刻も猶予できない仕事があります(例えば、対応するURLのhttpヘッダ情報を送信します).すなわち,戻り値が変化するまで関数を呼び出し続ける必要がある.次のwhileサイクルは
$activ
e変数がtrueの場合に続きます.この変数は2番目のパラメータとして渡されました curl_multi_exec()
,バッチハンドルにアクティブな接続があるかどうかを示します.次に呼び出します curl_multi_select()
,アクティブな接続(サーバの応答を受け入れるなど)が表示される前に、「マスク」されます.この関数が正常に実行されると、別のdo-whileループに入り、次のURLに進みます.十二、まとめ
このブログでは、いくつかのcURLの用途を列挙しただけで、サンプルコードは比較的簡単です.しかし、あなたが見終わったらcURLを使う衝動があると信じています.では、自分で関連資料を探して、マニュアルをテストしましょう.
さあ、ここまでにしましょう.辛抱強く読んでくれてありがとう!
添付:
';
//var_dump($response);
//var_dump($httpInfo);
curl_close ($ci);
return $response;
}
private static function build_http_query_multi($params, $files) {
if (!$params) return '';
$pairs = array();
self::$boundary = $boundary = uniqid('------------------');
$MPboundary = '--'.$boundary;
$endMPboundary = $MPboundary. '--';
$multipartbody = '';
foreach ($params as $key => $value) {
$multipartbody .= $MPboundary . "\r
";
$multipartbody .= 'content-disposition: form-data; name="' . $key . "\"\r
\r
";
$multipartbody .= $value."\r
";
}
foreach ($files as $key => $value) {
if (!$value) {continue;}
if (is_array($value)) {
$url = $value['url'];
if (isset($value['name'])) {
$filename = $value['name'];
} else {
$parts = explode( '?', basename($value['url']));
$filename = $parts[0];
}
$field = isset($value['field']) ? $value['field'] : $key;
} else {
$url = $value;
$parts = explode( '?', basename($url));
$filename = $parts[0];
$field = $key;
}
$content = file_get_contents($url);
$multipartbody .= $MPboundary . "\r
";
$multipartbody .= 'Content-Disposition: form-data; name="' . $field . '"; filename="' . $filename . '"'. "\r
";
$multipartbody .= "Content-Type: image/unknown\r
\r
";
$multipartbody .= $content. "\r
";
}
$multipartbody .= $endMPboundary;
return $multipartbody;
}
}