ホームページ  >  記事  >  バックエンド開発  >  PHPのfile_get_contents()よりも優れたcURLの例を詳しく解説

PHPのfile_get_contents()よりも優れたcURLの例を詳しく解説

黄舟
黄舟オリジナル
2017-09-11 09:32:382540ブラウズ

PHP は file_get_content() 関数を使用して Web ページのコンテンツをキャプチャできますが、ファイルのアップロードまたはダウンロード、Cookie 操作などのより複雑な処理を実行することはできません。 PHP の cURL はこれらの機能を提供します。

1. cURLの紹介

cURLはPHPの拡張ライブラリです。さまざまな種類のプロトコルを使用して、さまざまな種類のサーバーに接続して通信できます。

現在、http、https、ftp、gopher、telnet、dict、file、ldapプロトコルをサポートしており、HTTPS認証、HTTP POST、FTPアップロード、プロキシ、Cookie、ユーザー名+パスワード認証などもサポートしています。

2. cURL関数ライブラリ

よく使われる関数

関数説明 cURLセッションを初期化するcurl_setopt() cURL オプションを設定しますcurl_exec()curl_getinfo() 現在のセッション情報を取得curl_errno() 最後のエラーコードを返すcurl_error()に戻るcurrent セッションの最後のエラー文字列curl_close() cURLセッションを閉じるその他の関数
cURLセッションを実行


FunctionDescriptioncurl_co )cURLをコピーするハンドルとすべてのオプションがあります。 curl_escape() 指定された文字列を URL エンコードしてエスケープした文字列を返します。 curl_file_create() CURLFile オブジェクトを作成します。 curl_multi_add_handle() 個々の Curl ハンドルを cURL バッチ セッションに追加します。 curl_multi_close() cURL ハンドルのグループを閉じます。 curl_multi_exec() 現在の cURL ハンドルのサブ接続を実行します。 curl_multi_getcontent() CURLOPT_RETURNTRANSFER が設定されている場合、取得した出力のテキスト ストリームを返します。 curl_multi_info_read() 現在解析されている cURL の関連する送信情報を取得します。 curl_multi_init() 新しい cURL バッチ ハンドルを返します。 curl_multi_remove_handle() cURL バッチ ハンドル リソース内のハンドル リソースを削除します。 curl_multi_select() cURL バッチ内のすべてのアクティブな接続を待ちます。 curl_multi_setopt()バッチ cURL 転送オプションを設定します。 curl_multi_strerror() エラー コードを説明する文字列テキストを返します。 curl_pause()接続を一時停止して再開します。 curl_reset() libcurl のセッションハンドルのすべてのオプションをリセットします。 curl_setopt_array() cURL 転送セッションのオプションを一括で設定します。 curl_share_close() cURL 共有ハンドルを閉じます。 curl_share_init() cURL 共有ハンドルを初期化します。 curl_share_setopt() 共有ハンドルの cURL 転送オプションを設定します。 curl_strerror() エラー コードの説明文字列を返します。 curl_unescape() URL エンコードされた文字列をデコードします。 curl_version() cURL のバージョン情報を取得します。


3. 実装プロセス

1. cURL セッションを初期化します

2. cURL セッションを実行します

4. cURL 情報および/またはエラー情報を取得します

5. cURL ハンドル

ここで最も複雑な部分はステップ 2 です。多くの cURL 設定オプションがあります。以下の例でそれについて学びます。


IV. 例1: GETリクエスト

GETリクエストの処理はcURLの一般的な処理です。

ローカル サーバー localserver.com のルート ディレクトリに、次の内容のテスト スクリプトindex.php を準備します。

<?php
    $url = &#39;http://www.baidu.com&#39;;
    // 初始化,获得一个cURL句柄
    $ch = curl_init();
    
    // 设置选项
    curl_setopt($ch, CURLOPT_URL, $url); // 请求URL
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回数据流,而不直接输出
    curl_setopt($ch, CURLOPT_HEADER, 0); // 无需响应的header头
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); //连接超时,秒为单位

    // 执行并获取返回内容
    $output = curl_exec($ch);
    if($output === false){
        $output = &#39;cURL error: &#39; . curl_error($ch);
    }
    // 释放 cURL 句柄资源
    curl_close($ch);

    print_r($output);
?>

ブラウザはローカル サーバーのホームページ localserver.com/index.php にアクセスし、Baidu のホームページを表示します。

5. 例 2. POST リクエスト

POST リクエストでは 2 つのオプションを設定する必要があります:

curl_setopt($ch, CURLOPT_POST, 1); // 表明POST请求
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData)); // POST提交数据

まず、リモート サーバー (remoteserver.com) のルート ディレクトリで受信するためのスクリプト Index.php を、次の内容で準備します。

<?php
    $input = file_get_contents(&#39;php://input&#39;);
    echo $input;
?>

次に、ローカル サーバー localserver.com のルート ディレクトリを使用して、POST リクエストに使用されるスクリプトindex.php を記述します。内容は次のとおりです。

<?php
    $url = &#39;http://remoteserver.com/index.php&#39;;
    $data = array(
        &#39;fname&#39;=> &#39;Daniel&#39;,
        &#39;lname&#39; => &#39;Stenberg&#39;
    );

     // 初始化
    $ch = curl_init();
    
    // 设置选项
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_POST, 1); // POST请求
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //POST数据。用http_build_query()转换为“&”拼接的字符串

    // 执行并获取返回内容
    $output = curl_exec($ch);
    if($output === false){
        $output =  &#39;cURL error: &#39; . curl_error($ch);
    }

    // 释放 cURL 句柄资源
    curl_close($ch);

    print_r($output);
?>

ブラウザが localserver.com/index.php にアクセスすると、表示は以下の通りです:

fname=Daniel&lname=Stenberg

6. 例3. ファイルをアップロードする

cURLでファイルをアップロードする考え方は、ファイルパスの前に「@」記号を追加し、アップロードするリクエストフィールドに設置することです。バックグラウンドは、$_FILES を通じてアップロードされたファイル情報を取得できます。ただし、PHP5.6以降は「@」記号が廃止され、CURLFileクラスを利用してアップロードを実装できるようになりました。

まずリモートサーバーremoteserver.comのルートディレクトリに受信スクリプトindex.phpを用意し、内容は以下の通りです:

<?php
    $action = $_POST[&#39;action&#39;];
    if($action == &#39;uploadImage&#39;){
        $name = $_FILES[&#39;file&#39;][&#39;name&#39;];
        $tmpname = $_FILES[&#39;file&#39;][&#39;tmp_name&#39;];
        
        // 保存到当前脚本所在目录
        move_uploaded_file($tmpname, dirname(__FILE__).&#39;/&#39;.$name);

        $error = $_FILES[&#39;file&#39;][&#39;error&#39;];
        switch ($error) {
            case 0: echo &#39;上传成功&#39;; break;
            case 1: echo &#39;文件大小超出 php.ini 限制&#39;; break;
            case 2: echo &#39;文件大小超出 表单 MAX_FILE_SIZE 限制&#39;; break;
            case 3: echo &#39;文件部分被上传&#39;; break;
            case 4: echo &#39;没有文件被上传&#39;; break;
            case 6: echo &#39;找不到临时文件夹&#39;; break;
            case 7: echo &#39;文件写入失败&#39;; break;
            default: $output = &#39;未知错误&#39;;
        }
    }
?>

次に画像ファイルtest.jpgとcURLアップロードスクリプトインデックスをリモートサーバーのルートディレクトリに用意します。ローカルサーバー localserver.com.php のスクリプトの内容は次のとおりです:

<?php
    $url = &#39;http://remoteserver.com/index.php&#39;;
    $file = realpath(getcwd() . &#39;/test.jpg&#39;);
    $data = array(
        &#39;action&#39; => &#39;uploadImage&#39;,
        &#39;file&#39; => &#39;@&#39; . $file
    );
    if(version_compare(PHP_VERSION, &#39;5.6.0&#39;) > 0){
        $data[&#39;file&#39;] = new CURLFile($file);
    }
    
    // 初始化
    $ch = curl_init();
    
    // 设置选项
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    // 执行并获取返回内容
    $output = curl_exec($ch);
    if($output === false){
        $output =  &#39;cURL error: &#39; . curl_error($ch);
    }

    // 释放 cURL 句柄资源
    curl_close($ch);

    print_r($output);
?>

ブラウザは localserver.com/index.php にアクセスし、表示は次のようになります:

上传成功

リモート サーバーのルート ディレクトリを確認すると、追加の写真がアップロードされました。

VII. 例 4. ファイルをダウンロードする

cURL を使用してファイルをダウンロードするための 1 つのアイデアは、cURL オプション CURLOPT_FILE をファイル ポインターとして設定し、要求されたリソース ファイルをファイル ストリームに関連付けることです。このファイル ストリームは通常 fopen() です。関数の値。ファイル ストリームを使用してリモート ファイルをローカルに書き込むと、大きなファイルを書き込む (ダウンロードする) ときに発生する可能性のあるメモリ エラーを回避できます。

ローカルサーバーlocalserver.comのルートディレクトリにテストスクリプトindex.phpを書きます 内容は以下の通りです:

<?php
    $url = &#39;http://remoteserver.com/test.jpg&#39;;
    $file = &#39;./test.jpg&#39;;
    $fp = fopen($file, &#39;w&#39;);

    // 初始化
    $ch = curl_init();

    // 设置选项
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_FILE, $fp); // 用于传输的文件流,默认是STDOUT

    // 执行并获取返回内容
    $output = curl_exec($ch);
    if($output === false){
        $output =  &#39;cURL error: &#39; . curl_error($ch);
    }

    // 获取已下载大小
    $size_download = curl_getinfo($ch, CURLINFO_SIZE_DOWNLOAD);

    // 释放资源
    fclose($fp);
    curl_close($ch); 

    if ($size_download && $size_download == filesize($file)) {
        echo "下载成功";
    } else {
        echo "下载失败或不完整";
    }   
?>

ブラウザはlocalserver.com/index.phpにアクセスし、表示は以下のようになります:

下载成功

ローカル サーバーのルート ディレクトリを確認すると、リモート画像がダウンロードされていることがわかります。

8. バッチ処理

cURL にはバッチ ハンドルがあり、これは複数の cURL ハンドルを開き、これらのハンドルをバッチ ハンドルにバインドし、各 cURL 接続をループで順番に処理することで実現できます。 、「マルチスレッド」に似ています。

ローカルサーバーlocalserver.comのルートディレクトリにテストスクリプトindex.phpを書きます 内容は以下の通りです:

<?php
    $urls = array(
        &#39;http://www.baidu.com&#39;,
        &#39;http://www.qidian.com&#39;
    );
    $count = count($urls);
    $ch = array();

    // 创建批处理cURL句柄
    $mh = curl_multi_init();

    // 初始化每个cURL,并设置选项,绑定给批处理句柄
    for ($i = 0; $i < $count; $i++) {
        $ch[$i] = curl_init();
        curl_setopt($ch[$i], CURLOPT_URL, $urls[$i]);
        curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch[$i], CURLOPT_HEADER, 0);
        curl_setopt($ch[$i], CURLOPT_CONNECTTIMEOUT, 30);
        curl_multi_add_handle($mh, $ch[$i]);
    }

    // 执行批处理
    $running = null;
    do {
        usleep(10000); // 延迟0.01秒,单位为百万分之一秒
        curl_multi_exec($mh, $running); // 异步实现批处理,类似“多线程”
    } while($running > 0);

    // 获取每个cURL的响应
    $res = array();
    for ($i = 0; $i < $count; $i++) {
        $res[$i] = curl_multi_getcontent($ch[$i]);
    }

    // 关闭全部句柄
    for ($i = 0; $i < $count; $i++) {
        curl_multi_remove_handle($mh, $ch[$i]);
    }
    curl_multi_close($mh);

    print_r($res);
?>

ブラウザはlocalserver.com/index.phpにアクセスし、「接続済み」のBaiduホームページとQidianを表示します。 .comのホームページ。

以上がPHPのfile_get_contents()よりも優れたcURLの例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。