phpのcurl使用入門チュートリアルと一般的な使用例-上

15133 ワード

要約: [ディレクトリ]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をサポートしています.
[  ]
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; } }