>백엔드 개발 >PHP 튜토리얼 >PHP의 컬, fsocket, file_get_content 함수 비교

PHP의 컬, fsocket, file_get_content 함수 비교

WBOY
WBOY원래의
2016-07-25 09:12:141231검색

최근 웹 도둑 프로그램을 작업할 때 file_get_content가 더 이상 요구 사항을 충족할 수 없다는 것을 발견했습니다. 원격 콘텐츠를 읽을 때 file_get_content가 컬보다 사용하기 편리한 점만 빼면 컬만큼 좋지는 않은 것 같아요

원격 콘텐츠를 캡쳐하기 위해 예전부터 file_get_content 함수를 사용해왔는데 사실 컬이라는 좋은 기능이 있다는 건 알고 있었는데, 살펴보니 사용법이 꽤 복잡하다는 걸 느꼈습니다. file_get_content만큼 간단하지 않으며 요구 사항도 크지 않으므로 컬 사용 방법을 배울 필요가 없습니다.

PHP에서 컬과 file_get_content 간의 일부 비교 주요 차이점: Curl은 FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 및 LDAP를 포함한 많은 프로토콜을 지원합니다. 즉, file_get_content가 할 수 없는 많은 일을 할 수 있습니다. Curl은 PHP에서 콘텐츠를 원격으로 획득하고 수집할 수 있으며, PHP 웹 버전의 FTP 업로드 및 다운로드를 구현하고, 인터페이스 도킹(API)을 구현하고, 시뮬레이션된 쿠키를 구현합니다. 기능은 매우 강력합니다. 컬의 몇 가지 기본 사용법을 이해한 후에는 설정 매개변수 중 일부를 기억하는 것이 조금 어렵지만 일반적으로 사용되는 몇 가지 매개변수만 기억하면 됩니다. 컬을 켜십시오: PHP는 기본적으로 컬 기능을 지원하지 않기 때문에 컬을 사용하려면 먼저 php.ini에서 이 기능을 활성화해야 합니다. 즉, ;extension= php_curl.dll 앞에 있는 세미콜론을 제거한 다음 저장하고 다시 시작해야 합니다. 아파치/iis . 기본 구문:

  1. $my_curl = cur_init(); //curl 객체 초기화
  2. curl_setopt($my_curl, CURLOPT_URL, "http://bbs.it- home.org"); //크롤링에 필요한 URL 설정
  3. curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1); //결과를 문자열로 저장할지 화면에 출력할지 설정합니다. 1은 저장을 의미합니다. 결과. 문자열로
  4. $str =curl_exec($curl); //요청 실행
  5. echo $str; //가져온 결과 출력
  6. curl_close($curl);
코드 복사

최근에 다른 사람의 웹사이트에서 음악 데이터를 가져와야 합니다. file_get_contents 함수를 사용했지만 항상 가져오지 못하는 문제가 발생했습니다. 매뉴얼의 예제에 따라 시간 초과를 설정했지만 대부분 작동하지 않습니다.

  1. $config['context'] = stream_context_create(array('http' => array('method' => "GET",
  2. 'timeout' => 5//이 시간 제한은 불안정하고 작동하지 않는 경우가 많습니다
  3. )
  4. ));
코드 복사

가끔 서버의 연결 풀을 살펴보면 비슷한 오류가 많이 발견되어 큰 골칫거리가 됩니다. file_get_contents(http://***): 스트림을 열지 못했습니다… 이제 대신 컬 라이브러리를 사용하고 함수 대체를 작성합니다.

  1. 함수 컬_파일_get_contents($durl){
  2. $ch = 컬_init();
  3. curl_setopt($ch, CURLOPT_URL, $durl);
  4. curl_setopt($ch, CURLOPT_TIMEOUT, 5);
  5. curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
  6. curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
  7. curl_setopt($ch, CURLOPT_RETURNT RANSF 응급실, 1 ) ;
  8. $r = curl_exec($ch);
  9. curl_close($ch);
  10. return $r;
  11. }
코드 복사

그래서 실제 네트워크 문제 외에는 더 이상 문제가 없습니다. 다음은 컬 및 file_get_contents에 대해 다른 사람들이 수행한 테스트입니다. file_get_contents가 google.com을 크롤링하는 데 걸리는 시간(초): 2.31319094 2.30374217 2.21512604 3.30553889 2.30124092 컬 사용 시간: 0.68719101 0.64675593 0.64326 0.81983113 0.63956594 큰 차이가 있나요? 하하, 제 경험상 이 두 도구는 속도뿐 아니라 안정성에서도 다릅니다. 네트워크 데이터 캡처의 안정성에 대한 요구 사항이 높은 친구는 위의 cur_file_get_contents 기능을 사용하는 것이 좋습니다. 안정적이고 빠를 뿐만 아니라 브라우저를 위조하여 대상 주소를 스푸핑할 수도 있습니다!

curl 및 file_get_contents의 사용법에 대해서는 이전 기사에서 많이 언급한 바 있습니다. 참고할 만한 몇 가지 좋은 기사는 다음과 같습니다.

  • PHP file_get_contents 시간 초과 처리 설정 방법
  • 잘못된 Gzip 웹페이지를 잡아내는 php file_get_contents에 대한 솔루션
  • PHP의 file_get_contents 시간 초과 문제에 대한 해결 방법
  • PHP file_get_contents 시간 초과 설정 방법
  • php file_get_content 호환성 감지 예시
  • 페이지 정보를 캡처하는 php file_get_contents 코드
  • 페이지 정보를 캡처하는 php file_get_contents 함수 코드

방법 1: file_get_contents를 사용하여 가져오기 모드에서 콘텐츠 가져오기

  1. $url='http://www.domain.com/';
  2. $html = file_get_contents($ url);
  3. echo $html;
  4. ?>
코드 복사

방법 2: fopen으로 URL을 열고 get 메소드로 콘텐츠 가져오기

  1. $fp = fopen($url, 'r');
  2. stream_get_meta_data($fp);
  3. while(!feof($fp)) {
  4. $result .= fgets($fp, 1024);
  5. }
  6. echo "url body: $result";
  7. fclose($fp);
  8. ?>
코드 복사

방법 3: 포스트 모드에서 file_get_contents 함수를 사용하여 URL 가져오기

  1. $data = array('foo' => 'bar');
  2. $data = http_build_query($ data);
  3. $opts = array (
  4. 'http' => array (
  5. 'method' => 'POST',
  6. 'header'=> "콘텐츠 유형: 애플리케이션 /x-www-form-urlencodedrn" .
  7. "콘텐츠 길이: " . strlen($data) . "rn",
  8. 'content' => $data
  9. )
  10. );
  11. $context = stream_context_create($opts);
  12. $html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
  13. echo $html;
  14. ?>
코드 복사

방법 4: fsockopen 함수로 URL을 열고 get 모드에서 헤더 및 몸

  1. 함수 get_url($url,$cookie=false)
  2. {
  3. $url=parse_url($url );
  4. $query = $url[path]."?".$url[query];
  5. echo "Query:".$query;
  6. $fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30);
  7. if (!$fp) {
  8. return false;
  9. } else {
  10. $request = "GET $query HTTP/1.1rn";
  11. $request .= "호스트: $url[host]rn";
  12. $request .= "연결: 닫기";
  13. if($cookie) $request.="쿠키: $cookien";
  14. $request.="rn";
  15. fwrite($fp,$request);
  16. while()) {
  17. $result .= @ fgets($fp, 1024);
  18. }
  19. fclose($fp);
  20. return $result;
  21. }
  22. }
  23. //URL의 html 부분을 가져오고 제거 헤더
  24. 함수 GetUrlHTML($url,$cookie=false)
  25. {
  26. $rowdata = get_url($url,$cookie);
  27. if($rowdata)
  28. {
  29. $body= stristr($rowdata,"rnrn");
  30. $body=substr($body,4,strlen($body));
  31. return $body;
  32. }
  33. return false;
  34. }
  35. ?>
코드 복사

방법 5: fsockopen 함수로 URL을 열고 POST에서 전체 데이터 가져오기 헤더와 본문을 포함한 모드

  1. 기능 HTTP_Post($URL,$data,$cookie, $referrer="")
  2. {
  3. // 주어진 URL 구문 분석
  4. $URL_Info=parse_url($URL);
  5. // 리퍼러 구축
  6. if($referrer=="") // 제공되지 않은 경우 이 스크립트를 리퍼러로 사용
  7. $referrer="111″;
  8. // $data에서 문자열 만들기
  9. foreach($data as $key=>$value)
  10. $values[]="$key=".urlencode($ value);
  11. $data_string=implode("&",$values);
  12. // 어떤 포트가 필요한지 확인 – 제공되지 않은 경우 표준(=80)을 사용
  13. if(!isset($URL_Info) ["port"]))
  14. $URL_Info["port"]=80;
  15. // POST 요청 작성:
  16. $request.="POST ".$URL_Info["path"]." HTTP/1.1n";
  17. $request.="호스트: ".$URL_Info["host"]."n";
  18. $request.="참조자: $referern";
  19. $request. ="콘텐츠 유형: application/x-www-form-urlencodedn";
  20. $request.="콘텐츠 길이: ".strlen($data_string)."n";
  21. $request.="연결 : closen";
  22. $request.="쿠키: $cookien";
  23. $request.="n";
  24. $request.=$data_string."n";
  25. $fp = fsockopen ($URL_Info["host"],$URL_Info["port"]);
  26. fputs($fp, $request);
  27. while(!feof($fp)) {
  28. $result .= fgets($fp, 1024);
  29. }
  30. fclose($fp);
  31. return $result;
  32. }
  33. ?>
코드 복사

방법 6: 컬 라이브러리 사용 컬 라이브러리를 사용하기 전에 php.ini에서 컬 확장 기능이 켜져 있는지 확인해야 할 수도 있습니다.

  1. $ch = 컬_init();
  2. $timeout = 5;
  3. curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com/');
  4. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  5. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  6. $file_contents = cur_exec($ ch);
  7. curl_close($ch);
  8. echo $file_contents;
  9. ?>
코드 복사

PHP의 세 가지 기능인 컬, fsockopen 및 file_get_contents는 모두 시뮬레이션된 음성 수집을 실현할 수 있습니다. 셋의 차이점이나 주의할 점이 있나요? 자오용빈: 가끔 file_get_contents()를 사용하여 외부 파일을 호출할 때 시간 초과로 인한 오류를 보고하기 쉬운 경우가 있습니다. 그냥 컬로 바꾸세요. 구체적인 이유는 명확하지 않습니다. Curl은 file_get_contents() 및 fsockopen()보다 더 효율적입니다. CURL이 자동으로 DNS 정보를 캐시하기 때문입니다(하이라이트를 테스트해야 함)

판지아펑: file_get_contents 컬 fsockopen 일반화 없이 현재 요청된 환경에서 선택적 작업: 우리 회사에서 개발한 KBI 애플리케이션을 살펴보겠습니다. 방금 사용을 시작했습니다: file_get_contents 나중에 채택됨: fsockopen 지금까지 마지막으로 사용한 것: 컬 (원격으로) 개인적인 이해는 이렇습니다.(틀리면 지적해 주시고, 틀리면 추가해주세요) file_get_contents는 php.ini에서 Allow_url_fopen을 활성화해야 합니다. http를 요청할 때 http_fopen_wrapper가 사용됩니다. keeplive.curl을 모르더라도 괜찮습니다. file_get_contents()는 단일 실행 효율성이 높고 헤더 없이 정보를 반환합니다. 일반 파일을 읽을 때는 문제가 되지 않지만, 원격 파일을 읽을 때는 문제가 발생합니다. 지속적인 연결을 설정하려면 여러 페이지를 여러 번 요청하세요. 그러면 file_get_contents 및 fopen에 문제가 발생합니다. 획득한 내용이 정확하지 않을 수도 있습니다. 그래서 유사한 수집 작업을 할 때 분명히 문제가 있을 것입니다. 양말은 상대적으로 수준이 낮고 구성이 번거롭고 작동이 어렵습니다. 완전한 정보를 반환합니다.

판샤오닝-텐센트: file_get_contents는 특정 URL의 내용을 가져올 수 있지만 게시할 수는 없습니다. Curl은 게시하고 얻을 수 있습니다. 헤드 정보도 얻을 수 있습니다 소켓은 낮은 수준입니다. UDP 또는 TCP 프로토콜을 기반으로 상호 작용하도록 설정 가능 file_get_contents와 컬이 이를 수행할 수 있다면 소켓이 이를 수행할 수 있습니다. 소켓이 할 수 있는 일을 컬은 할 수 없을 수도 있습니다. file_get_contents는 데이터를 가져오는 경우가 더 많습니다. 더 효율적이고 간단합니다. Zhao의 상황도 겪었고 CURL을 통해 호스트를 설정했는데 괜찮았습니다. 이는 네트워크 환경과 관련이 있습니다.

이상입니다. 위 내용은 PHP에서 url, fsocket, file_get_content 함수 사용의 유사점과 차이점을 예제를 통해 소개한 것입니다.



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