php 사용 curl 상세 해석 및 문제 집합

14180 단어 php컬.
칠석 입 니 다.개발 로 서 여동생 은 건 드 리 지 않 으 면 서버 를 내 려 놓 으 세 요.여동생 은 건 드 려 야 할 친구 가 있 으 면 왼쪽 에 여동생 을 안 고 오른쪽 에 서버 를 안 으 세 요.게다가 여동생 은 선물 을 원 하 는 것 이 고 서버 도 사용 하지 않 습 니 다.자,긴 말 하지 않 겠 습 니 다.오늘 의 도구 인 CURL(Client URL Library)에 제 사 를 지 냅 니 다.물론 오늘 은 PHP 방식 으로 이 도 구 를 사용 합 니 다.
0.컬 은 무엇 인가
PHP supports libcurl, a library created by Daniel Stenberg, that allows you to connect and communicate to many different types of servers with many different types of protocols. libcurl currently supports the http, https, ftp, gopher, telnet, dict, file, and ldap protocols. libcurl also supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading (this can also be done with PHP's ftp extension), HTTP form based upload, proxies, cookies, and user+password authentication.
이것 은 PHP 가 curl 에 대한 설명 입 니 다.쉽게 말 하면 curl 은 하나의 라 이브 러 리 로 URL 을 통 해 다양한 서버 와 결탁 하고 말 을 걸 며 깊이 있 게 교류 할 수 있 으 며 많은 프로 토 콜 도 지원 합 니 다.또한 curl 은 https 인증,http post,ftp 업로드,대리,cookies,간단 한 구령 인증 등 기능 을 지원 할 수 있다 고 말 했다.
그렇게 많은 말 을 했 는데 별로 느낌 이 없 었 죠?응용 프로그램 에서 만 느낌 이 들 었 어 요.저도 처음에 서버 에서 다른 서버 에 POST 요청 을 해 야 curl 을 접 하기 시 작 했 어 요.그리고 느낌 이 들 었 어 요.
본 격 적 으로 어떻게 사용 하 는 지 말 하기 전에 먼저 한 마디 하 세 요.당신 은 PHP 환경 에서 curl 모듈 을 설치 하고 사용 해 야 합 니 다.구체 적 인 방식 은 말 하지 않 겠 습 니 다.시스템 에 따라 설치 방식 이 다 릅 니 다.google 에서 찾 아 보 거나 PHP 공식 문 서 를 찾 아 보 는 것 도 간단 합 니 다.
1.가 져 와 서 먼저 손 을 시험 해 본다.
도 구 를 손 에 넣 으 면 먼저 놀 고,손 에 들 어 오 는 지 시험 해 봐 야 한다.그렇지 않 으 면 가 져 오 자마자 쓰 고,너의 코드 를 난 장 판 으로 만 들 었 는데 어떻게 서버 를 건 드 리 겠 니?
예 를 들 어 우 리 는 유명한'인터넷 연결 여 부 를 테스트 하 는'사이트 인 바 이 두 를 예 로 들 어 curl 을 시도 한다.

<?php 
  // create curl resource 
  $ch = curl_init(); 

  // set url 
  curl_setopt($ch, CURLOPT_URL, "baidu.com"); 

  //return the transfer as a string 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

  // $output contains the output string 
  $output = curl_exec($ch); 

  //echo output
  echo $output;

  // close curl resource to free up system resources 
  curl_close($ch);   
?>

로 컬 환경 브 라 우 저 에서 이 phop 파일 을 열 었 을 때 페이지 에 바 이 두 의 첫 페이지 가 나 타 났 습 니 다.제 가 방금 입력 한"localhost"는 요?
위의 코드 와 주석 은 이 코드 가 무엇 을 하고 있 는 지 충분히 설명 했다.$ch = curl_init(),curl 세 션 자원 을 만 들 고 핸들 을 되 돌려 주 는 데 성공 했다.
curl_setopt($ch, CURLOPT_URL,"baidu.com"),URL 설정,말 할 필요 도 없 음;
위의 두 문장 을 합쳐서$ch=curlinit("baidu.com");curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0)이것 은 응답 결 과 를 변수 에 저장 할 지 여 부 를 설정 하 는 것 입 니 다.1 은 저장 하고 0 은 직접 echo 입 니 다.$output = curl_exec($ch)실행 한 다음 에 응답 결 과 를$output 변수 에 저장 하여 아래 echo 를 제공 합 니 다.
curl_close($ch)이 curl 세 션 자원 을 닫 습 니 다.
PHP 에서 curl 을 사용 하 는 것 은 크게 이러한 형식 입 니 다.그 중에서 두 번 째 단 계 는 curl 을 통 해setopt 방법 으로 파 라 메 터 를 설정 하 는 것 이 가장 복잡 하고 가장 중요 합 니 다.관심 이 있 으 면 공식 적 으로 설정 가능 한 매개 변수 에 대한 상세 한 참 고 를 볼 수 있 습 니 다.길 게 보면 토 할 것 같 습 니 다.수요 에 따라 능숙 해 지 는 것 이 좋 겠 습 니 다.
요약 하면 phop 에서 curl 용법 은 curl 세 션 만 들 기->설정 인자->실행->세 션 닫 기 입 니 다.
다음은 우리 가 자주 사용 하 는 상황 을 살 펴 보 겠 습 니 다.우 리 는 어떻게 자신 을 꾸 미 는 지(매개 변 수 를 설정)해 야 정확하게'여동생 을 꼬 실 수 있 습 니 다'(서버 에 정확하게 꼬 실 수 있 습 니 다).
2.인사-GET 와 POST 요청 및 HTTPS 프로 토 콜 처리
먼저 서버 에 인 사 를 드 리 겠 습 니 다.서버 에 Hello 를 보 내 주세요.여기 서 가장 편리 한 방법 은 서버 에 GET 요청 을 하 는 것 입 니 다.물론 POST 라 는 작은 쪽지 도 OK 입 니 다.
2.1 GET 요청
우 리 는'어떤 유명 동성 교우 사이트 github 에서 키 워드 를 검색 합 니 다'를 예 로 들 었 다.

//  curl  GET     
<?php 
  // create curl resource 
  $ch = curl_init(); 

  // set url 
  curl_setopt($ch, CURLOPT_URL, "https://github.com/search?q=react"); 

  //return the transfer as a string 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

  // $output contains the output string 
  $output = curl_exec($ch); 

  //echo output
  echo $output;

  // close curl resource to free up system resources 
  curl_close($ch);   
?>

이전의 그 예 와 별 차이 가 없 는 것 같 지만,여기에 두 가지 제기 할 점 이 있다.
1.기본 요청 방식 은 GET 이 므 로 GET 방식 을 명시 적 으로 지정 할 필요 가 없습니다.
2.https 요청,http 요청 이 아 닙 니 다.여러 곳 에서 HTTPS 요청 을 본 적 이 있 을 수 있 습 니 다.SSL 인증서 의 검 사 를 몇 줄 더 해서 자원 을 성공 적 으로 요청 해 야 합 니 다.그런데 여기 에는 필요 하지 않 은 것 같 습 니 다.이 유 는 무엇 입 니까?
The two Curl options are defined as:

CURLOPT_SSL_VERIFYPEER - verify the peer's SSL certificate 
CURLOPT_SSL_VERIFYHOST - verify the certificate's name against host
They both default to true in Curl, and shouldn't be disabled unless you've got a good reason. Disabling them is generally only needed if you're sending requests to servers with invalid or self-signed certificates, which is only usually an issue in development. Any publicly-facing site should be presenting a valid certificate, and by disabling these options you're potentially opening yourself up to security issues.

즉,불법 또는 자체 제작 인증 서 를 사용 하지 않 는 한 대부분 개발 환경 에 나타 나 야 이 두 줄 을 false 로 설정 하여 ssl 인증서 검 사 를 피 할 수 있 습 니 다.그렇지 않 은 사람 은 이렇게 하지 않 아 도 됩 니 다.이렇게 하 는 것 은 안전 하지 않 습 니 다.
2.2 POST 요청
그러면 POST 요청 은 어떻게 하나 요?테스트 를 위해 한 테스트 서버 에 POST 를 받 는 스 크 립 트 를 보 냈 습 니 다.

//testRespond.php
<?php 
  $phpInput=file_get_contents('php://input');
  echo urldecode($phpInput);
?>
일반 데이터 보 내기
그리고 로 컬 에 요청 을 쓰 십시오:

<?php 
  $data=array(
  "name" => "Lei",
  "msg" => "Are you OK?"
  );

  $ch = curl_init(); 

  curl_setopt($ch, CURLOPT_URL, "http://      IP   /testRespond.php"); 
  curl_setopt($ch, CURLOPT_POST, 1);
  //The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
  curl_setopt($ch, CURLOPT_POSTFIELDS , http_build_query($data));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

  $output = curl_exec($ch); 

  echo $output;

  curl_close($ch);   
?>

브 라 우 저 실행 결 과 는:
name=Lei&msg=Are you OK?
여기 서 우 리 는 POST 데이터 로 서버 에 전송 하 는 배열 을 만 들 었 습 니 다.
curl_setopt($ch, CURLOPT_POST,1)POST 요청 임 을 나타 낸다.
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,60)가장 오래 참 을 수 있 는 연결 시간 을 설정 합 니 다.초 단위 로 미라 가 될 때 까지 기다 릴 수 는 없 잖 아 요.
curl_setopt($ch, CURLOPT_POSTFIELDS , http_build_query($data)는 POST 의 데이터 필드 를 설정 합 니 다.여 기 는 배열 데이터 형식 이기 때문에 httpbuild_query 처리 해 주세요.
제 이 슨 데이터 에 대해 서 는 어떻게 POST 요청 을 합 니까?

<?php 
  $data='{"name":"Lei","msg":"Are you OK?"}';

  $ch = curl_init(); 

  curl_setopt($ch, CURLOPT_URL, "http://      IP   /testRespond.php"); 
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length:' . strlen($data)));
  curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

  $output = curl_exec($ch); 

  echo $output;

  curl_close($ch);   
?>

브 라 우 저 실행,표시:
{"name":"Lei","msg":"Are you OK?"}
3.파일 업로드 및 다운로드 방법
이미 서버 와 꼬 였 으 니 이 럴 때 는 사진 을 받 아 봐 야 겠 지.너 도 자신의 사진 을 올 려 보 여 줘 야 겠 다.두 사람 이 함께 있 는 것 은 외모 가 중요 하지 않 지만 남 준 녀 예 는 항상 최고 다.
3.1 자신의 사진 한 장 을 전송 하여 과거 에 성 의 를 표 하 다―POST 가 파일 을 업로드 하 다
같은 원 격 서버 에서 우 리 는 먼저 수신 스 크 립 트 를 전송 하고 그림 을 받 아 로 컬 에 저장 합 니 다.파일 과 폴 더 권한 문제 에 주의 하고 쓰기 권한 이 필요 합 니 다.

<?php
  if($_FILES){
    $filename = $_FILES['upload']['name'];
     $tmpname = $_FILES['upload']['tmp_name'];
     //             
     if(move_uploaded_file($tmpname,dirname(__FILE__).'/'.$filename)){
      echo ('    ');
     }
  }
?>
그리고 로 컬 서버 의 php curl 부분 을 다시 쓰 겠 습 니 다.

<?php 
  $data = array('name'=>'boy', "upload"=>"@boy.png");

  $ch = curl_init(); 

  curl_setopt($ch, CURLOPT_URL, "http://          /testRespond.php"); 
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
  curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

  $output = curl_exec($ch); 

  echo $output;

  curl_close($ch);     
?>

브 라 우 저 에서 실행 해 보 세 요.모든 것 이 쌀 로 되 어 있 습 니 다.원 격 서버 를 보 러 가 보 았 지만 아무것도 올 리 지 못 했 습 니 다.
왜 이러 지?위의 코드 는 여러분 이 curl phop POST 그림 을 검색 할 때 가장 흔히 볼 수 있 는 코드 일 것 입 니 다.이것 은 제 가 현재 사용 하고 있 는 것 은 PHP 5.6 이상 버 전 입 니 다.@기 호 는 PHP 5.6 이후 에 버 려 졌 습 니 다.PHP 5.3 은 여전히 사용 할 수 있 기 때문에 일부 학생 들 은 실행 할 수 있다 는 것 을 발 견 했 습 니 다.대부분 PHP 버 전이 다 르 고 curl 은 이 두 버 전에 서 호 환 되 지 않 기 때 문 입 니 다.위 는 PHP 5.3 의 실현 이다.
다음은 PHP 5.6 및 이후 의 실현,

<?php 
  $data = array('name'=>'boy', "upload"=>"");
  $ch = curl_init(); 

  $data['upload']=new CURLFile(realpath(getcwd().'/boy.png'));

  curl_setopt($ch, CURLOPT_URL, "http://115.29.247.189/test/testRespond.php");
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
  curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

  $output = curl_exec($ch); 

  echo $output;

  curl_close($ch);     
?>

여기 서 CURLFile 대상 을 도입 하여 이 를 실현 합 니 다.이에 대해 구체 적 으로 문 서 를 찾 아 볼 수 있 습 니 다.이때 원 격 서버 디 렉 터 리 에 가 보 니 사진 이 한 장 있 었 고 우리 가 방금 올 린 사진 이 확실 했다.
3.2 원 격 서버 여동생 의 사진 가 져 오기-사진 캡 처
서버 여동생 도 성실 하 게 사진 을 보고 내 가 매우 자상 하고 눈 썰 미가 좋다 고 생각 하여 대범 하 게 자신의 사진 을 꺼 냈 다.그러나 좀 부 끄 러 운 것 은 그녀 가 주동 적 으로 가 져 오 려 고 하지 않 아서 우리 가 직접 가 져 가 야 한 다 는 것 이다.
원 격 서버 는 자신의 디 렉 터 리 에 girl.jpg 라 는 그림 을 저장 하고 주 소 는 웹 서버 루트 디 렉 터 리/girl.jpg 입 니 다.지금 이 사진 을 가 져 오 려 고 합 니 다.

<?php 
  $ch = curl_init(); 

  $fp=fopen('./girl.jpg', 'w');

  curl_setopt($ch, CURLOPT_URL, "http://          /girl.jpg"); 
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); 
  curl_setopt($ch, CURLOPT_FILE, $fp); 

  $output = curl_exec($ch); 
  $info = curl_getinfo($ch);

  fclose($fp);

  $size = filesize("./girl.jpg");
  if ($size != $info['size_download']) {
    echo "        ,     ";
  } else {
    echo "      ";
  }

  curl_close($ch);  
?>

지금,우리 의 현재 목록 아래 에 방금 받 은 사진 이 한 장 있 습 니 다.매우 흥분 되 지 않 습 니까?
여기 서 말 할 만 한 것 은 curlgetinfo 방법,이것 은 이번 요청 과 관련 된 정 보 를 얻 는 방법 으로 디 버 깅 에 도움 이 되 므 로 잘 사용 해 야 합 니 다.
4.HTTP 인증 어떻게
이때 서버 의 학부 모 는 우리 딸 이 아직 어 려 서 상 대 를 찾 을 수 없다 며 딸 을 가두 고 비밀번호 자 물 쇠 를 채 웠 다.이른바 HTTP 인증,서버 는 몰래 비둘기 에 게 HTTP 인증 사용자 이름과 비밀 번 호 를 주 었 다.만 나 서 도망 가라 고 했다.
그러면 사용자 이름과 비밀 번 호 를 받 았 는데 우 리 는 어떻게 PHP CURL 을 통 해 HTTP 인증 을 해결 합 니까?
PS:여기 서 게 으 름 을 피 우 면 HTTP 인증 을 받 지 않 고 코드 를 넣 어 보 겠 습 니 다.분석 해 보 겠 습 니 다.

function curl_auth($url,$user,$passwd){
  $ch = curl_init();
  curl_setopt_array($ch, [
    CURLOPT_USERPWD => $user.':'.$passwd,
    CURLOPT_URL   => $url,
    CURLOPT_RETURNTRANSFER => true
  ]);
  $result = curl_exec($ch);
  curl_close($ch);
  return $result;
}

$authurl = 'http://   HTTP     ';

echo curl_auth($authurl,'vace','passwd');

여기 재 미 있 는 곳 이 있 습 니 다.
curl_setopt_array 이 방법 은 배열 을 통 해 여러 개의 인 자 를 한꺼번에 설정 하여 여러 곳 에서 설정 해 야 할 촘촘 한 curlsetopt 방법.
5.쿠키 를 이용 하여 로그 인 시 뮬 레이 션
이때 당신 은 서버 여동생 을 성공 적 으로 만 났 습 니 다.그녀 를 데 리 고 도망 가 려 고 했 지만 어 쩔 수 없 이 멀 지 않 았 습 니 다.서버 여동생 은 어머니 서버 에 금고 가 있 으 니 로그 인하 여 좀 내 려 올 수 있다 고 말 했 습 니 다.
먼저 분석 해 보 겠 습 니 다.이 일 은 두 단계 로 나 뉘 는데 하 나 는 로그 인 인터페이스 에서 계 정 비밀 번 호 를 통 해 로그 인 한 다음 에 쿠키 를 얻 는 것 입 니 다.다른 하 나 는 쿠키 를 이용 하여 정보 페이지 에 로그 인하 여 정 보 를 얻 는 것 입 니 다.대체적인 구 조 는 이 렇 습 니 다.

<?php 
 //  post    
 $post = array ( 
  'email' => '  ', 
  'pwd' => '  '
 ); 
 //     
 $url = "    "; 
 //  cookie     
 $cookie = dirname(__FILE__) . '/cookie.txt'; 
 //            
 $url2 = "           "; 
 //     
 login_post($url, $cookie, $post); 
 //         
 $content = get_content($url2, $cookie); 
 //  cookie   
 @ unlink($cookie);

 var_dump($content);  
?>

그리고 우 리 는 다음 두 가지 방법의 실현 을 생각한다.

login_post($url, $cookie, $post)
get_content($url2, $cookie)
//     
function login_post($url, $cookie, $post) { 
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);
  curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
  curl_exec($curl); 
  curl_close($curl);
}
//          
function get_content($url, $cookie) { 
  $ch = curl_init(); 
  curl_setopt($ch, CURLOPT_URL, $url); 
  curl_setopt($ch, CURLOPT_HEADER, 0); 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 
  $rs = curl_exec($ch); 
  curl_close($ch); 
  return $rs; 
}
이로써 아 날로 그 로그 인 에 성 공 했 습 니 다.모든 것 이 순 조 롭 습 니 다.phop CURL 을 통 해 서버 를 건 드 리 는 것 이 이렇게 간단 합 니 다.
물론 CURL 의 능력 은 여기에 그 치지 않 는 다.본 고 는 백 엔 드 PHP 개발 에서 가장 많이 사용 되 는 몇 가지 장면 에 대해 정리 하고 요약 하고 자 한다.마지막 한 마디 로 구체 적 인 문 제 를 구체 적 으로 분석 하 다.

좋은 웹페이지 즐겨찾기