Maison  >  Article  >  développement back-end  >  Explication détaillée d'exemples de cURL meilleur que file_get_contents() en PHP

Explication détaillée d'exemples de cURL meilleur que file_get_contents() en PHP

黄舟
黄舟original
2017-09-11 09:32:382558parcourir

PHP peut utiliser la fonction file_get_content() pour capturer le contenu d'une page Web, mais il ne peut pas effectuer de traitements plus complexes, tels que le téléchargement ou le téléchargement de fichiers, les opérations de cookies, etc. Le cURL de PHP fournit ces fonctions.

1. Introduction à cURL

 cURL est une bibliothèque d'extensions pour PHP. Il peut se connecter et communiquer avec différents types de serveurs et en utilisant différents types de protocoles.

Il prend actuellement en charge les protocoles http, https, ftp, gopher, telnet, dict, file et ldap, et prend également en charge l'authentification HTTPS, HTTP POST, le téléchargement FTP, le proxy, les cookies et l'authentification par nom d'utilisateur + mot de passe, etc.

2. Bibliothèque de fonctions cURL

Fonctions communes

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


Autres fonctions

函数 描述
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. Processus de mise en œuvre

1. Initialiser la session cURL

2. Définir les options cURL

3. . Obtenez des informations sur cURL et/ou des informations sur les erreurs (cette étape est facultative)

5. Fermez le handle cURL

L'étape la plus compliquée est l'étape 2. Il existe de nombreuses options de configuration de cURL ci-dessous. j'en apprendrai davantage à l'aide d'exemples.


4. Exemple 1 : requête GET

 Le processus de requête GET est le processus général de cURL.

Préparez un script de test index.php dans le répertoire racine du serveur local localserver.com avec le contenu suivant :

Le navigateur accède à la page d'accueil du serveur local localserver.com/index .php et affiche la page d'accueil de Baidu.
<?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);
?>

5. Exemple 2. Requête POST

La requête POST doit définir deux options :

Préparez d'abord une requête de réception dans le répertoire racine du serveur distant serveur distant .com Le script index.php, le contenu est le suivant :
curl_setopt($ch, CURLOPT_POST, 1); // 表明POST请求
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData)); // POST提交数据

Ensuite écrivez le script index.php pour requête POST dans le répertoire racine du serveur local localserver.com, le contenu est le suivant :
<?php
    $input = file_get_contents(&#39;php://input&#39;);
    echo $input;
?>

Le navigateur accède à localserver.com/index.php, et l'affichage est le suivant :
<?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);
?>

6. Exemple 3. Télécharger des fichiers
fname=Daniel&lname=Stenberg

L'idée du téléchargement de fichiers par cURL est la suivante : ajoutez le symbole "@" devant le chemin du fichier et installez-le dans le champ de requête pour réaliser le téléchargement. L'arrière-plan peut obtenir des informations sur les fichiers téléchargés via $_FILES. Cependant, après PHP5.6, le symbole « @ » est supprimé et la classe CURLFile peut être utilisée pour implémenter le téléchargement.

Préparez d'abord un script index.php à recevoir dans le répertoire racine du serveur distant remoteserver.com, avec le contenu suivant :

Préparez ensuite une image dans le répertoire racine de le serveur local localserver.com Fichier test.jpg et le script de téléchargement cURL index.php, le contenu du script est le suivant :
<?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;;
        }
    }
?>

Lorsque le navigateur accède à localserver.com/index.php, l'affichage est le suivant suit :
<?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);
?>

Afficher à distance Dans le répertoire racine du serveur, j'ai trouvé une image supplémentaire que je viens de télécharger.
上传成功

7. Exemple 4. Télécharger des fichiers

Une idée pour télécharger des fichiers à l'aide de cURL est de définir l'option cURL CURLOPT_FILE comme pointeur de fichier pour associer le fichier de ressources demandé à un flux de fichiers. stream est généralement la valeur de retour de la fonction fopen(). L'utilisation de flux de fichiers pour écrire des fichiers distants localement peut éviter d'éventuelles erreurs de mémoire lors de l'écriture (téléchargement) de fichiers volumineux.

Écrivez le script de test index.php dans le répertoire racine du serveur local localserver.com Le contenu est le suivant :

Lorsque le navigateur accède à localserver.com/index. php, l'affichage est le suivant :
<?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 "下载失败或不完整";
    }   
?>

Vérifiez le répertoire racine du serveur local et constatez que l'image distante a été téléchargée.
下载成功

8. Exemple 5. Traitement par lots

cURL a un handle de lot, en ouvrant plusieurs handles cURL et en liant ces handles à un handle de lot, puis séquentiellement dans la boucle. Le traitement de chaque connexion cURL peut réaliser un traitement par lots asynchrone, similaire au "multi-threading".

Écrivez le script de test index.php dans le répertoire racine du serveur local localserver.com Le contenu est le suivant :

Le navigateur accède à localserver.com/index.php. et affiche la page d'accueil « Connecter » de Baidu et la page d'accueil de Qidian.com.
<?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);
?>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn