目次
1. cURLの紹介
2. cURL関数ライブラリ
GETリクエストの処理はcURLの一般的な処理です。
POST リクエストでは 2 つのオプションを設定する必要があります:
cURLでファイルをアップロードする考え方は、ファイルパスの前に「@」記号を追加し、アップロードするリクエストフィールドに設置することです。バックグラウンドは、$_FILES を通じてアップロードされたファイル情報を取得できます。ただし、PHP5.6以降は「@」記号が廃止され、CURLFileクラスを利用してアップロードを実装できるようになりました。
cURL を使用してファイルをダウンロードするための 1 つのアイデアは、cURL オプション CURLOPT_FILE をファイル ポインターとして設定し、要求されたリソース ファイルをファイル ストリームに関連付けることです。このファイル ストリームは通常 fopen() です。関数の値。ファイル ストリームを使用してリモート ファイルをローカルに書き込むと、大きなファイルを書き込む (ダウンロードする) ときに発生する可能性のあるメモリ エラーを回避できます。
cURL にはバッチ ハンドルがあり、これは複数の cURL ハンドルを開き、これらのハンドルをバッチ ハンドルにバインドし、各 cURL 接続をループで順番に処理することで実現できます。 、「マルチスレッド」に似ています。
ホームページ バックエンド開発 PHPチュートリアル PHPのfile_get_contents()よりも優れたcURLの例を詳しく解説

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

Sep 11, 2017 am 09:32 AM
curl file

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PythonでCURLリクエストとPythonリクエストの相互変換を実現する方法 PythonでCURLリクエストとPythonリクエストの相互変換を実現する方法 May 03, 2023 pm 12:49 PM

curl と Pythonrequests は両方とも、HTTP リクエストを送信するための強力なツールです。 curl はターミナルから直接リクエストを送信できるコマンドライン ツールですが、Python のリクエスト ライブラリは、Python コードからリクエストを送信するためのよりプログラム的な方法を提供します。 curl を Pythonrequestscurl コマンドに変換するための基本的な構文は次のとおりです。curl[OPTIONS]URLcurl コマンドを Python リクエストに変換する場合、オプションと URL を Python コードに変換する必要があります。これは、curlPOST コマンドの例です:curl-XPOST https://example.com/api

JavaのFile.length()関数を使用してファイルのサイズを取得します。 JavaのFile.length()関数を使用してファイルのサイズを取得します。 Jul 24, 2023 am 08:36 AM

ファイルのサイズを取得するには、Java の File.length() 関数を使用します。ファイル操作を扱うとき、ファイル サイズは非常に一般的な要件です。Java では、ファイルのサイズを取得するための非常に便利な方法、つまり length( ) File クラスのメソッド。この記事では、このメソッドを使用してファイルのサイズを取得する方法と、対応するコード例を紹介します。まず、サイズを取得したいファイルを表す File オブジェクトを作成する必要があります。 File オブジェクトを作成する方法は次のとおりです: Filef

PHP BLOBをファイルに変換する方法 PHP BLOBをファイルに変換する方法 Mar 16, 2023 am 10:47 AM

PHP BLOB をファイルに変換する方法: 1. PHP サンプル ファイルを作成します; 2. 「function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })」を通じて} 」メソッドを使用して、Blob をファイルに変換できます。

紅夢ネイティブアプリケーションのランダムな詩 紅夢ネイティブアプリケーションのランダムな詩 Feb 19, 2024 pm 01:36 PM

オープン ソースの詳細については、次のサイトを参照してください。 51CTO Honmeng 開発者コミュニティ https://ost.51cto.com 実行環境 DAYU200:4.0.10.16SDK: 4.0.10.15IDE: 4.0.600 1. アプリケーションを作成するには、[ファイル] をクリックします。 >新しいファイル ->プロジェクトの作成。テンプレートを選択します: [OpenHarmony] EmptyAbility: プロジェクト名 shici、アプリケーション パッケージ名 com.nut.shici、およびアプリケーションの保存場所 XXX (中国語、特殊文字、スペースは含まれません) を入力します。 CompileSDK10、モデル: ステージ。デバイス

Linux での CURL バージョンの更新に関するチュートリアル! Linux での CURL バージョンの更新に関するチュートリアル! Mar 07, 2024 am 08:30 AM

Linux でカールのバージョンを更新するには、以下の手順に従います。 現在のカールのバージョンを確認します。 まず、現在のシステムにインストールされているカールのバージョンを確認する必要があります。ターミナルを開き、次のコマンドを実行します。curl --version このコマンドは、現在のcurlバージョン情報を表示します。利用可能なcurlのバージョンを確認する:curlを更新する前に、利用可能な最新バージョンを確認する必要があります。 Curl の公式 Web サイト (curl.haxx.se) または関連ソフトウェア ソースにアクセスして、curl の最新バージョンを見つけることができます。 Curl ソース コードをダウンロードする:curl またはブラウザを使用して、選択した CURL バージョンのソース コード ファイル (通常は .tar.gz または .tar.bz2) をダウンロードします。

最初から最後まで: PHP 拡張機能 cURL を使用して HTTP リクエストを行う方法 最初から最後まで: PHP 拡張機能 cURL を使用して HTTP リクエストを行う方法 Jul 29, 2023 pm 05:07 PM

最初から最後まで: HTTP リクエストに php 拡張機能 cURL を使用する方法 はじめに: Web 開発では、多くの場合、サードパーティ API または他のリモート サーバーと通信する必要があります。 cURL を使用して HTTP リクエストを行うのは、一般的で強力な方法です。この記事では、PHP を使用して cURL を拡張して HTTP リクエストを実行する方法を紹介し、いくつかの実用的なコード例を示します。 1. 準備 まず、php に cURL 拡張機能がインストールされていることを確認します。コマンドラインで php-m|grepcurl を実行して確認できます。

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 Jul 08, 2023 pm 09:13 PM

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 最近、PHPは最新バージョンのPHP8.1を正式にリリースし、重要な機能である複数リクエストの同時処理のためのcurlを導入しました。この新機能により、開発者は複数の HTTP リクエストをより効率的かつ柔軟に処理できるようになり、パフォーマンスとユーザー エクスペリエンスが大幅に向上します。以前のバージョンでは、複数のリクエストを処理するには、多くの場合、複数の CURL リソースを作成し、ループを使用してデータをそれぞれ送受信する必要がありました。この方法でも目的は達成できますが、

JavaのFile.renameTo()関数を使用してファイルの名前を変更する JavaのFile.renameTo()関数を使用してファイルの名前を変更する Jul 25, 2023 pm 03:45 PM

Java の File.renameTo() 関数を使用してファイルの名前を変更する Java プログラミングでは、ファイルの名前を変更する必要がよくあります。 Java には、ファイル操作を処理するための File クラスが用意されており、その renameTo() 関数でファイルの名前を簡単に変更できます。この記事では、Java の File.renameTo() 関数を使用してファイルの名前を変更する方法と、対応するコード例を紹介します。 File.renameTo() 関数は、File クラスのメソッドです。

See all articles