>  기사  >  백엔드 개발  >  PHP에서 file_get_contents()보다 나은 cURL 예제에 대한 자세한 설명

PHP에서 file_get_contents()보다 나은 cURL 예제에 대한 자세한 설명

黄舟
黄舟원래의
2017-09-11 09:32:382529검색

PHP는 file_get_content() 함수를 사용하여 웹 페이지 콘텐츠를 캡처할 수 있지만 파일 업로드 또는 다운로드, 쿠키 작업 등과 같은 더 복잡한 처리를 수행할 수는 없습니다. PHP의 cURL은 이러한 기능을 제공합니다.

1. cURL 소개

 cURL은 PHP용 확장 라이브러리입니다. 다양한 유형의 서버와 다양한 유형의 프로토콜을 사용하여 연결하고 통신할 수 있습니다.

 현재 http, https, ftp, gopher, telnet, dict, 파일 및 ldap 프로토콜을 지원하며 HTTPS 인증, HTTP POST, FTP 업로드, 프록시, 쿠키 및 사용자 이름 + 비밀번호 인증 등도 지원합니다.

2.cURL 함수 라이브러리

자주 사용하는 함수

Function Description
컬_init() cURL 세션 초기화
컬_setopt() cURL 옵션 설정
컬_exec()
cURL 세션 실행
컬_getinfo() 현재 세션 정보 가져오기
컬_errno() 마지막 오류 코드 반환
curl_error() 다음으로 돌아가기 current 세션의 마지막 오류 문자열
컬_close() cURL 세션 닫기


기타 기능

Function Description
curl_co handler() cURL 복사 핸들과 모든 옵션이 있습니다.
curl_escape() 주어진 문자열을 인코딩하는 URL, 이스케이프된 문자열을 반환합니다.
curl_file_create() CURLFile 객체를 생성합니다.
curl_multi_add_handle() 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 세션 초기화

3. 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 요청은 두 가지 옵션을 설정해야 합니다:

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을 사용하여 파일을 다운로드하는 한 가지 아이디어는 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. 예시 5. 일괄 처리

 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.