PHP는 file_get_content() 함수를 사용하여 웹 페이지 콘텐츠를 캡처할 수 있지만 파일 업로드 또는 다운로드, 쿠키 작업 등과 같은 더 복잡한 처리를 수행할 수는 없습니다. PHP의 cURL은 이러한 기능을 제공합니다.
cURL은 PHP용 확장 라이브러리입니다. 다양한 유형의 서버와 다양한 유형의 프로토콜을 사용하여 연결하고 통신할 수 있습니다.
현재 http, https, ftp, gopher, telnet, dict, 파일 및 ldap 프로토콜을 지원하며 HTTPS 인증, HTTP POST, FTP 업로드, 프록시, 쿠키 및 사용자 이름 + 비밀번호 인증 등도 지원합니다.
자주 사용하는 함수
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 버전 정보를 가져옵니다. |
1. cURL 세션 초기화
3. cURL 세션 실행
4. cURL 정보 및/또는 오류 정보 가져오기
5. cURL 핸들
여기서 가장 복잡한 부분은 2단계입니다. cURL에 대한 많은 설정 옵션이 있습니다. 아래 예를 통해 이에 대해 알아 보겠습니다.
IV. 예시 1: GET 요청
로컬 서버 localserver.com의 루트 디렉터리에 다음 내용을 포함하는 테스트 스크립트 index.php를 준비합니다.
<?php $url = 'http://www.baidu.com'; // 初始化,获得一个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 = 'cURL error: ' . curl_error($ch); } // 释放 cURL 句柄资源 curl_close($ch); print_r($output); ?>
브라우저는 로컬 서버 홈페이지 localserver.com/index.php에 액세스하여 Baidu 홈페이지를 표시합니다.
5. 예제 2. POST 요청
curl_setopt($ch, CURLOPT_POST, 1); // 表明POST请求 curl_setopt($ch, CURLOPT_POSTFIELDS, $postData)); // POST提交数据
먼저 원격 서버인 Remoteserver.com의 루트 디렉터리에서 수신할 index.php 스크립트를 다음 내용으로 준비합니다.
<?php $input = file_get_contents('php://input'); echo $input; ?>
그런 다음 로컬 서버 localserver.com의 루트 디렉터리에서 POST 요청에 사용되는 index.php 스크립트를 작성합니다. 내용은 다음과 같습니다.
<?php $url = 'http://remoteserver.com/index.php'; $data = array( 'fname'=> 'Daniel', 'lname' => 'Stenberg' ); // 初始化 $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 = 'cURL error: ' . curl_error($ch); } // 释放 cURL 句柄资源 curl_close($ch); print_r($output); ?>
브라우저가 localserver.com/index.php에 액세스하면 표시는 다음과 같습니다:
fname=Daniel&lname=Stenberg
6. 예시 3. 파일 업로드
먼저 원격 서버 Remoteserver.com의 루트 디렉터리에 수신 스크립트 index.php를 준비합니다. 내용은 다음과 같습니다.
<?php $action = $_POST['action']; if($action == 'uploadImage'){ $name = $_FILES['file']['name']; $tmpname = $_FILES['file']['tmp_name']; // 保存到当前脚本所在目录 move_uploaded_file($tmpname, dirname(__FILE__).'/'.$name); $error = $_FILES['file']['error']; switch ($error) { case 0: echo '上传成功'; break; case 1: echo '文件大小超出 php.ini 限制'; break; case 2: echo '文件大小超出 表单 MAX_FILE_SIZE 限制'; break; case 3: echo '文件部分被上传'; break; case 4: echo '没有文件被上传'; break; case 6: echo '找不到临时文件夹'; break; case 7: echo '文件写入失败'; break; default: $output = '未知错误'; } } ?>
그런 다음 로컬 서버의 루트 디렉터리에 이미지 파일 test.jpg와 cURL 업로드 스크립트 인덱스를 준비합니다. localserver.com.php, 스크립트 내용은 다음과 같습니다.
<?php $url = 'http://remoteserver.com/index.php'; $file = realpath(getcwd() . '/test.jpg'); $data = array( 'action' => 'uploadImage', 'file' => '@' . $file ); if(version_compare(PHP_VERSION, '5.6.0') > 0){ $data['file'] = 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 = 'cURL error: ' . curl_error($ch); } // 释放 cURL 句柄资源 curl_close($ch); print_r($output); ?>
브라우저가 localserver.com/index.php에 액세스하고 표시 내용은 다음과 같습니다.
上传成功
원격 서버의 루트 디렉터리를 확인하여 방금 올라온 추가 사진.
VII. 예 4. 파일 다운로드
로컬 서버 localserver.com의 루트 디렉토리에 테스트 스크립트 index.php를 작성합니다. 내용은 다음과 같습니다.
<?php $url = 'http://remoteserver.com/test.jpg'; $file = './test.jpg'; $fp = fopen($file, 'w'); // 初始化 $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 = 'cURL error: ' . 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. 일괄 처리
로컬 서버 localserver.com의 루트 디렉터리에 index.php를 작성합니다. 내용은 다음과 같습니다.
<?php $urls = array( 'http://www.baidu.com', 'http://www.qidian.com' ); $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 중국어 웹사이트의 기타 관련 기사를 참조하세요!