최근 웹 도둑 프로그램을 작업할 때 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 .
기본 구문:
-
- $my_curl = cur_init(); //curl 객체 초기화
- curl_setopt($my_curl, CURLOPT_URL, "http://bbs.it- home.org"); //크롤링에 필요한 URL 설정
- curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1); //결과를 문자열로 저장할지 화면에 출력할지 설정합니다. 1은 저장을 의미합니다. 결과. 문자열로
- $str =curl_exec($curl); //요청 실행
- echo $str; //가져온 결과 출력
- curl_close($curl);
-
코드 복사
최근에 다른 사람의 웹사이트에서 음악 데이터를 가져와야 합니다. file_get_contents 함수를 사용했지만 항상 가져오지 못하는 문제가 발생했습니다. 매뉴얼의 예제에 따라 시간 초과를 설정했지만 대부분 작동하지 않습니다.
-
- $config['context'] = stream_context_create(array('http' => array('method' => "GET",
- 'timeout' => 5//이 시간 제한은 불안정하고 작동하지 않는 경우가 많습니다
- )
- ));
코드 복사
가끔 서버의 연결 풀을 살펴보면 비슷한 오류가 많이 발견되어 큰 골칫거리가 됩니다.
file_get_contents(http://***): 스트림을 열지 못했습니다…
이제 대신 컬 라이브러리를 사용하고 함수 대체를 작성합니다.
-
- 함수 컬_파일_get_contents($durl){
- $ch = 컬_init();
- curl_setopt($ch, CURLOPT_URL, $durl);
- curl_setopt($ch, CURLOPT_TIMEOUT, 5);
- curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
- curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
- curl_setopt($ch, CURLOPT_RETURNT RANSF 응급실, 1 ) ;
- $r = curl_exec($ch);
- curl_close($ch);
- return $r;
- }
-
코드 복사
그래서 실제 네트워크 문제 외에는 더 이상 문제가 없습니다.
다음은 컬 및 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를 사용하여 가져오기 모드에서 콘텐츠 가져오기
-
- $url='http://www.domain.com/';
- $html = file_get_contents($ url);
- echo $html;
- ?>
-
코드 복사
방법 2: fopen으로 URL을 열고 get 메소드로 콘텐츠 가져오기
-
- $fp = fopen($url, 'r');
- stream_get_meta_data($fp);
- while(!feof($fp)) {
- $result .= fgets($fp, 1024);
- }
- echo "url body: $result";
- fclose($fp);
- ?>
-
코드 복사
방법 3: 포스트 모드에서 file_get_contents 함수를 사용하여 URL 가져오기
-
- $data = array('foo' => 'bar');
- $data = http_build_query($ data);
- $opts = array (
- 'http' => array (
- 'method' => 'POST',
- 'header'=> "콘텐츠 유형: 애플리케이션 /x-www-form-urlencodedrn" .
- "콘텐츠 길이: " . strlen($data) . "rn",
- 'content' => $data
- )
- );
- $context = stream_context_create($opts);
- $html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
- echo $html;
- ?>
-
코드 복사
방법 4: fsockopen 함수로 URL을 열고 get 모드에서 헤더 및 몸
-
- 함수 get_url($url,$cookie=false)
- {
- $url=parse_url($url );
- $query = $url[path]."?".$url[query];
- echo "Query:".$query;
- $fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30);
- if (!$fp) {
- return false;
- } else {
- $request = "GET $query HTTP/1.1rn";
- $request .= "호스트: $url[host]rn";
- $request .= "연결: 닫기";
- if($cookie) $request.="쿠키: $cookien";
- $request.="rn";
- fwrite($fp,$request);
- while()) {
- $result .= @ fgets($fp, 1024);
- }
- fclose($fp);
- return $result;
- }
- }
- //URL의 html 부분을 가져오고 제거 헤더
- 함수 GetUrlHTML($url,$cookie=false)
- {
- $rowdata = get_url($url,$cookie);
- if($rowdata)
- {
- $body= stristr($rowdata,"rnrn");
- $body=substr($body,4,strlen($body));
- return $body;
- }
- return false;
- }
- ?>
-
코드 복사
방법 5: fsockopen 함수로 URL을 열고 POST에서 전체 데이터 가져오기 헤더와 본문을 포함한 모드
-
- 기능 HTTP_Post($URL,$data,$cookie, $referrer="")
- {
- // 주어진 URL 구문 분석
- $URL_Info=parse_url($URL);
- // 리퍼러 구축
- if($referrer=="") // 제공되지 않은 경우 이 스크립트를 리퍼러로 사용
- $referrer="111″;
- // $data에서 문자열 만들기
- foreach($data as $key=>$value)
- $values[]="$key=".urlencode($ value);
- $data_string=implode("&",$values);
- // 어떤 포트가 필요한지 확인 – 제공되지 않은 경우 표준(=80)을 사용
- if(!isset($URL_Info) ["port"]))
- $URL_Info["port"]=80;
- // POST 요청 작성:
- $request.="POST ".$URL_Info["path"]." HTTP/1.1n";
- $request.="호스트: ".$URL_Info["host"]."n";
- $request.="참조자: $referern";
- $request. ="콘텐츠 유형: application/x-www-form-urlencodedn";
- $request.="콘텐츠 길이: ".strlen($data_string)."n";
- $request.="연결 : closen";
- $request.="쿠키: $cookien";
- $request.="n";
- $request.=$data_string."n";
- $fp = fsockopen ($URL_Info["host"],$URL_Info["port"]);
- fputs($fp, $request);
- while(!feof($fp)) {
- $result .= fgets($fp, 1024);
- }
- fclose($fp);
- return $result;
- }
- ?>
-
코드 복사
방법 6: 컬 라이브러리 사용 컬 라이브러리를 사용하기 전에 php.ini에서 컬 확장 기능이 켜져 있는지 확인해야 할 수도 있습니다.
-
- $ch = 컬_init();
- $timeout = 5;
- curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com/');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
- $file_contents = cur_exec($ ch);
- curl_close($ch);
- echo $file_contents;
- ?>
-
코드 복사
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 함수 사용의 유사점과 차이점을 예제를 통해 소개한 것입니다.
|