Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung von Beispielen für cURL, das in PHP besser als file_get_contents() ist

Detaillierte Erläuterung von Beispielen für cURL, das in PHP besser als file_get_contents() ist

黄舟
黄舟Original
2017-09-11 09:32:382481Durchsuche

PHP kann die Funktion file_get_content() zum Erfassen von Webseiteninhalten verwenden, kann jedoch keine komplexeren Verarbeitungen wie das Hoch- oder Herunterladen von Dateien, Cookie-Vorgänge usw. durchführen. cURL von PHP stellt diese Funktionen bereit.

1. Einführung in cURL

 cURL ist eine Erweiterungsbibliothek für PHP. Es kann verschiedene Arten von Servern verbinden und mit ihnen kommunizieren und verschiedene Arten von Protokollen verwenden.

Es unterstützt derzeit die Protokolle http, https, ftp, gopher, telnet, dict, file und ldap sowie HTTPS-Authentifizierung, HTTP POST, FTP-Upload, Proxy, Cookies und Benutzername + Passwort-Authentifizierung usw.

2. cURL-Funktionsbibliothek

Allgemeine Funktionen

函数 描述
 curl_init()  初始化 cURL 会话
 curl_setopt()  设置 cURL 选项
 curl_exec()
 执行 cURL 会话
 curl_getinfo()   获取当前会话信息
 curl_errno()  返回最后一次的错误代码  
 curl_error()  返回当前会话最后一次的错误字符串
 curl_close()  关闭 cURL 会话


Andere Funktionen

函数 描述
curl_copy_handle() 复制一个 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. Implementierungsprozess

1. cURL-Sitzung festlegen

3 . cURL-Informationen und/oder Fehlerinformationen abrufen (dieser Schritt ist optional)

5. Der komplizierteste Schritt ist Schritt 2. Nachfolgend finden Sie viele cURL-Einstellungsoptionen werde es anhand von Beispielen erfahren.

4. Beispiel 1: GET-Anfrage

 Der Prozess der GET-Anfrage ist der allgemeine Prozess von cURL.


Bereiten Sie im Stammverzeichnis des lokalen Servers localserver.com ein Testskript index.php mit folgendem Inhalt vor:

Der Browser greift auf die Homepage des lokalen Servers localserver.com/index zu .php und zeigt die Startseite von Baidu an.

5. Beispiel 2. POST-Anfrage

Bei der POST-Anfrage müssen zwei Optionen festgelegt werden:
<?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);
?>

Bereiten Sie zunächst eine Empfangsanfrage im Stammverzeichnis des Remote-Servers remoteserver vor .com Das Skript index.php, der Inhalt ist wie folgt:

Schreiben Sie dann das Skript index.php für die POST-Anfrage in das Stammverzeichnis des lokalen Servers localserver.com, der Inhalt ist wie folgt :

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

Der Browser greift auf localserver.com/index.php zu und die Anzeige sieht wie folgt aus:

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

6. Beispiel 3. Dateien hochladen

<?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);
?>
Die Idee beim Hochladen von cURL-Dateien besteht darin, vor dem Dateipfad das Symbol „@“ hinzuzufügen und es im Anforderungsfeld zu installieren, um das Hochladen zu erreichen. Der Hintergrund kann hochgeladene Dateiinformationen über $_FILES abrufen. Nach PHP5.6 wird das „@“-Symbol jedoch abgeschafft und die CURLFile-Klasse kann zum Implementieren des Hochladens verwendet werden.

Bereiten Sie zunächst ein Skript index.php für den Empfang im Stammverzeichnis des Remote-Servers remoteserver.com mit folgendem Inhalt vor:
fname=Daniel&lname=Stenberg

Bereiten Sie dann ein Bild im Stammverzeichnis von vor Der lokale Server localserver.com Datei test.jpg und cURL-Upload-Skript index.php, der Skriptinhalt lautet wie folgt:

Wenn der Browser auf localserver.com/index.php zugreift, ist die Anzeige wie folgt folgt:

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

Remote anzeigen Im Stammverzeichnis des Servers habe ich ein zusätzliches Bild gefunden, das ich gerade hochgeladen habe.

<?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);
?>
7. Beispiel 4. Dateien herunterladen

Eine Idee zum Herunterladen von Dateien mit cURL besteht darin, die cURL-Option CURLOPT_FILE als Dateizeiger festzulegen, um die angeforderte Ressourcendatei einem Dateistream zuzuordnen stream ist im Allgemeinen der Rückgabewert der Funktion fopen(). Durch die Verwendung von Dateistreams zum lokalen Schreiben von Remote-Dateien können mögliche Speicherfehler beim Schreiben (Herunterladen) großer Dateien vermieden werden.
上传成功

Schreiben Sie das Testskript index.php in das Stammverzeichnis des lokalen Servers localserver.com. Der Inhalt lautet wie folgt:

Wenn der Browser auf localserver.com/index zugreift. php, die Anzeige sieht wie folgt aus:

Überprüfen Sie das Stammverzeichnis des lokalen Servers und stellen Sie fest, dass das Remote-Image heruntergeladen wurde.

<?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 "下载失败或不完整";
    }   
?>
8. Beispiel 5. Stapelverarbeitung

cURL verfügt über ein Stapelhandle, indem mehrere cURL-Handles geöffnet und diese Handles an ein Stapelhandle gebunden werden, und dann nacheinander in der Schleife jede cURL-Verbindung verarbeitet werden kann Erzielen Sie eine asynchrone Stapelverarbeitung, ähnlich dem „Multithreading“.
下载成功

Schreiben Sie das Testskript index.php in das Stammverzeichnis des lokalen Servers localserver.com. Der Inhalt lautet wie folgt:

Der Browser greift auf localserver.com/index.php zu und zeigt die „Connect“-Baidu-Homepage und die Qidian.com-Homepage an.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für cURL, das in PHP besser als file_get_contents() ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn