PHP의 cURL 라이브러리

不言
풀어 주다: 2023-03-23 11:50:02
원래의
1844명이 탐색했습니다.

이 글은 PHP의 cURL 라이브러리를 소개합니다. 이제 공유하겠습니다. 도움이 필요한 친구들이 참고할 수 있습니다

개요

소개

설계 초기에는 cURL(클라이언트 URL 라이브러리)이 As입니다. URL 구문을 사용하여 데이터를 전송하기 위한 명령줄 도구입니다. cURL 라이브러리를 통해 PHP 스크립트의 특정 프로토콜을 자유롭게 사용하여 HTTP 요청 데이터 가져오기와 같은 데이터를 얻거나 제출할 수 있습니다. 간단히 말해서, cURL은 클라이언트가 서버에 리소스를 요청하는 도구입니다.

PHP는 Daniel Stenberg가 만든 libcurl 라이브러리를 지원하며, 이를 통해 다양한 서버에 연결하고 다양한 프로토콜을 사용할 수 있습니다. 현재 libcurl이 지원하는 프로토콜에는 http, https, ftp, gopher, telnet, dict, file 및 ldap이 포함됩니다. libcurl은 또한 HTTPS 인증서, HTTP POST, HTTP PUT, FTP 업로드(PHP의 FTP 확장을 통해서도 완료 가능), HTTP 양식 기반 업로드, 프록시, 쿠키, 사용자 이름 + 비밀번호 인증을 지원합니다.

장점

PHP에서는 실제로 특정 URL의 콘텐츠를 가져오는 것이 매우 간단합니다. file_get_contents() 함수를 사용하는 등 여러 가지 방법이 있습니다. file_get_contents() 函数:

<?php
$content = file_get_contents("https://segmentfault.com");
var_dump($content);
로그인 후 복사

虽然 file_get_contents() 函数使用起来很方便,但是不够灵活,也没法进行错误处理。在一些复杂的请求中,不能够设置请求头、Cookie、代理、认证等相关信息,更不能向某个服务器提交表单数据,上传文件。

cURl 库不但支持丰富的网络协议,而且提供了设置各种 URL 请求参数的方法,功能强大。cURL 的使用场景有很多,比如访问网页资源,获取 WebService 接口数据、下载 FTP 服务器文件。

使用

基本步骤

要使用 cURL 来发送 URL 请求,步骤大体分为以下四步:

  1. 初始化 cURL 会话;

  2. 设置请求选项;

  3. 执行 cURL 会话;

  4. 关闭 cURL 会话。

// 1. 初始化 cURL 会话
$ch = curl_init();

// 2. 设置请求选项
curl_setopt($ch, CURLOPT_URL, "https://segmentfault.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); # 获取的信息以字符串返回,而不是直接输出
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); # 禁止 cURL 验证对等证书,从而支持 HTTPS 访问

// 3. 执行 cURL 会话
$response = curl_exec($ch);
var_dump($response);

// 4. 关闭 cURL 会话
curl_close($ch);
로그인 후 복사
cURL 主要通过 curl_setopt() 函数设置请求选项,具体的每个选项说明请见 http://php.net/manual/zh/func...

错误处理

通过 curl_error() 函数可以查看 cURL 会话错误详情,而 curl_getinfo() 函数可以查看响应信息。因此,通过这两个函数我们可以实现一个简单的错误处理程序,比如我们现在访问一个不存在的 URL 地址:

<?php

// 1. 初始化 cURL 会话
$ch = curl_init();

// 2. 设置请求选项
curl_setopt($ch, CURLOPT_URL, "https://segmentfault.com/test.php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # 获取的信息以字符串返回,而不是直接输出
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); # 禁止 cURL 验证对等证书,从而支持 HTTPS 访问

// 3. 执行 cURL 会话
$response = curl_exec($ch);

if ($response  === FALSE) {
    echo "cURL connert error: " . curl_error($ch);
    exit;
}

$info = curl_getinfo($ch);
if ($info[&#39;http_code&#39;] == 404) {
    echo &#39;HTTP 404&#39;;
    exit;
}

var_dump($response);

// 4. 关闭 cURL 会话
curl_close($ch);
로그인 후 복사

实战案例

1. POST 请求

使用 cURL 模拟发送 POST 请求:

<?php
function curl_post($url, $data) {
    $ch = curl_init(); 

    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
        CURLOPT_POST => 1,           # 发送 POST 请求
        CURLOPT_POSTFIELDS => $data, # POST 请求数据 
    ]);

    $response = curl_exec($ch);
    
    curl_close($ch);
    
    return $response;
}

$url  = &#39;http://localhost/test.php&#39;;
$data = [&#39;id&#39; => 1, &#39;username&#39; => &#39;jochen&#39;];
echo curl_post($url, $data);
로그인 후 복사

2. 文件上传

CURLOPT_POSTFIELDS:全部数据使用 HTTP 协议中的 "POST" 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ';type=mimetype' 的格式指定。 这个参数可以是 urlencoded 后的字符串,类似'val1=1&val2=2&...',也可以使用一个以字段名为键值,字段数据为值的数组。

通过 cURL 发送 POST 请求来实现文件上传:

<?php
function curl_upload($url, $data) {
    $ch = curl_init(); 

    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
        CURLOPT_POST => 1,           # 发送 POST 请求
        CURLOPT_POSTFIELDS => $data, # POST 请求数据 
    ]);

    $response = curl_exec($ch);
    
    curl_close($ch);
    
    return $response;
}

$url  = &#39;http://localhost/test.php&#39;;
$data = [&#39;id&#39; => 1, &#39;file&#39; => &#39;@/root/image/boy.jpg&#39;];
echo curl_post($url, $data);
로그인 후 복사

3. 文件下载

其实,文件下载与普通 GET 请求是一样的,只是文件下载把返回内容保存至文件中,而不是简单的输出。配合 file_put_contents() 函数实现文件下载:

<?php
function curl_download($url, $path) {
    $ch = curl_init(); 

    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
    ]);

    $response = curl_exec($ch);
    
    curl_close($ch);
    
    return file_put_contents($path, $response);
}

curl_download(&#39;http://localhost/boy.jpg&#39;, &#39;./boy.jpg&#39;);
로그인 후 복사

4. HTTP 认证

如果服务器端需要验证请求,设置 CURLOPT_USERPWD

<?php
function curl_auth($url, $user, $passwd) {
    $ch = curl_init();
    
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_USERPWD => "$user:$passwd", # 格式为:"[username]:[password]"
        CURLOPT_RETURNTRANSFER => 1
    ]);
    
    $result = curl_exec($ch);
    
    curl_close($ch);
    
    return $result;
}

echo curl_auth(&#39;http://localhost&#39;, &#39;jochen&#39;, &#39;password&#39;);
로그인 후 복사

하지만 file_get_contents( ) 함수는 사용하기 편리하지만 유연성이 부족하고 오류를 처리할 수 없습니다. 일부 복잡한 요청에서는 양식 데이터를 서버에 제출하거나 파일을 업로드하는 것은 물론 요청 헤더, 쿠키, 프록시, 인증 및 기타 관련 정보를 설정하는 것도 불가능합니다.

cURl 라이브러리는 풍부한 네트워크 프로토콜을 지원할 뿐만 아니라 다양한 URL 요청 매개변수를 설정하는 강력한 방법을 제공합니다. 웹 리소스 액세스, WebService 인터페이스 데이터 가져오기, FTP 서버 파일 다운로드 등 cURL에 대한 다양한 사용 시나리오가 있습니다.

사용

기본 단계

cURL을 사용하여 URL 요청을 보내는 단계는 대략 다음 네 단계로 나뉩니다.

  1. cURL 세션 초기화

  2. 요청 옵션 설정; 세션;

  3. cURL 세션을 닫습니다.

  4. <?php
    // 模拟登录获取 Cookie
    function curl_login($url, $data, $cookie) {
        $ch = curl_init(); 
    
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_POST => 1,           # 发送 POST 请求
            CURLOPT_POSTFIELDS => $data, # POST 请求数据 
            CURLOPT_COOKIEJAR => $cookie # 将 cookie 信息保存至文件中
            CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
        ]);
    
        $response = curl_exec($ch);
        
        curl_close($ch);
        
        return $response;
    }
    
    // 获取页面数据
    function curl_content($url, $cookie) {
        $ch = curl_init(); 
        
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_COOKIEFILE => $cookie # 加载包含 Cookie 数据的文件
            CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
        ]);
    
        $response = curl_exec($ch);
        
        curl_close($ch);
        
        return $response;
    }
    
    $post = [&#39;username&#39; => &#39;jochen&#39;, &#39;password&#39; => &#39;123456&#39;];
    $cookie = &#39;./cookie.txt&#39;;
    if (curl_login(&#39;http://localhost/login&#39;, $post,  $cookie)) {
        echo curl_content(&#39;http://localhost&#39;, $cookie);
    }
    로그인 후 복사
  5. cURL은 주로 curl_setopt() 함수를 통해 요청 옵션을 설정합니다. 각 옵션에 대한 자세한 설명은 http://php.net/manual/zh/func...

    오류 처리
curl_error() 함수를 통해 cURL 세션 오류 세부 정보를 볼 수 있고, curl_getinfo() 함수를 통해 응답 정보를 볼 수 있습니다. 따라서 이 두 함수를 통해 간단한 오류 처리기를 구현할 수 있습니다. 예를 들어, 이제 존재하지 않는 URL 주소에 액세스하고 있습니다:

<?php
require __DIR__ . &#39;/vendor/autoload.php&#39;;

use \Curl\Curl;

$curl = new Curl();
$curl->get(&#39;https://www.example.com/&#39;);

if ($curl->error) {
    echo &#39;Error: &#39; . $curl->errorCode . &#39;: &#39; . $curl->errorMessage . "\n";
} else {
    echo &#39;Response:&#39; . "\n";
    var_dump($curl->response);
}
로그인 후 복사

실제 사례

1. POST 요청cURL을 사용하여 POST 요청 전송을 시뮬레이션합니다.

rrreee

2. 파일 업로드CURLOPT_POSTFIELDS: 모든 데이터는 HTTP 프로토콜의 "POST" 작업을 사용하여 전송됩니다. 파일을 보내려면 파일 이름 앞에 @를 붙이고 전체 경로를 사용하세요. 파일 형식은 파일 이름 뒤에 ';type=mimetype' 형식으로 지정할 수 있습니다. 이 매개변수는 'val1=1&val2=2&...'와 유사한 urlencoded 문자열일 수도 있고 필드 이름을 키로, 필드 데이터를 값으로 사용하는 배열을 사용할 수도 있습니다.

🎜파일 업로드를 구현하기 위해 cURL을 통해 POST 요청 보내기: 🎜rrreee🎜3. 파일 다운로드🎜🎜실제로 파일 다운로드는 반환된 콘텐츠를 단순히 저장하는 대신 파일에 저장한다는 점을 제외하면 일반 GET 요청과 동일합니다. 출력하고 있습니다. file_put_contents() 함수와 협력하여 파일 다운로드 구현: 🎜rrreee🎜4. HTTP 인증 🎜🎜서버가 요청을 확인해야 하는 경우 CURLOPT_USERPWD 매개변수를 설정하세요. 🎜 rrreee🎜5. 시뮬레이션된 로그인🎜🎜여기에서는 로그인 상태를 유지하기 위해 쿠키를 사용하는 애플리케이션을 주로 보여줍니다. 먼저 계정과 비밀번호로 로그인하여 쿠키 데이터를 가져온 다음 로그인된 쿠키를 사용하여 페이지 데이터를 가져와야 합니다. 🎜rrreee🎜cURL 패키징 라이브러리🎜🎜PHP Curl Class는 잘 작성된 cURL 패키징 라이브러리입니다. , 매우 편리하게 HTTP 요청을 보낼 수 있고 모든 종류의 웹 API와 통합될 수 있습니다. PHP Curl 클래스 래퍼 라이브러리는 PHP 5.3, 5.4, 5.5, 5.6, 7.0, 7.1 및 HHVM에서 사용할 수 있습니다. 이 라이브러리는 잘 알려져 있으며 매우 간단한 구문을 제공합니다. 🎜rrreee🎜 참조 기사: 🎜🎜🎜🎜클라이언트 URL 라이브러리 🎜🎜🎜🎜PHP에서 컬 사용 예제 시작하기 🎜🎜🎜🎜 CURL을 사용하면 몇 줄 밖에 걸리지 않습니다. 서버를 "속이기" - PHP 컬의 자세한 분석 및 일반적인 함정🎜🎜🎜🎜상위 7: PHP를 위한 최고의 컬 래퍼 라이브러리🎜🎜🎜🎜🎜관련 권장 사항: 🎜🎜🎜PHP 동시성을 위해 컬 사용 동시성은 백엔드 액세스를 줄입니다. time🎜🎜🎜🎜PHP는 CURL🎜🎜을 통한 로그인 및 데이터 가져오기를 시뮬레이션합니다.

위 내용은 PHP의 cURL 라이브러리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿