2009-03-29 3 views
2

file_get_contents를 사용하여 웹 페이지의 소스를 검색 할 수 있다는 것을 알고 있지만 가장 효율적인 방법을 알고 싶습니다.PHP를 통해 웹 사이트의 소스를 검색하는 가장 효율적인 방법은 무엇입니까? (GET 요청)

$this->socket = fsockopen($this->host, 80); 

    fputs($this->socket, 'GET ' . $this->target . ' HTTP/1.0' . "\n"); 
    fputs($this->socket, 'Host: ' . $this->host . "\n"); 
    fputs($this->socket, 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5' . "\n"); 
    fputs($this->socket, 'Connection: close' . "\n\n"); 

    $this->source = ''; 

    while(!feof($this->socket)) 
    { 
     $this->source .= fgets($this->socket, 128); 
    } 

    fclose($this->socket); 

이것이 최선의 방법입니다 :

나는 오래된 클래스 I는 다음과 같이 사용 오래 전에 만든? 가장 효율적인 방법은 가장 빠른 결과를 반환하는 것입니다.

답변

4

file_get_contents()이 가장 효과적입니다. 그러나 병목 현상이 네트워크가 아니고 프로세서가 아니기 때문에 어느 쪽이든 큰 차이는 없습니다. 코드의 가독성도 고려해야합니다.

뿐만 아니라이 벤치 마크를 고려 http://www.ebrueggeman.com/php_benchmarking_fopen.php

3

당신이 가지고있는 코드는 아마도 당신이 말하는 것을하는 가장 빠르고 간단한 방법 일 것입니다. 그러나 더 복잡한 작업 (예 : 게시 또는 Content-Encoding 및 Transfer-Encoding과 같은 HTTP 1.1 지원)을 수행하려는 경우 매우 유연하지 않습니다.

좀 더 복잡한 경우 등을 처리 할 수있는 것을 원하면 php cURL을 사용하십시오.

0

확인도 젠드 프레임 워크의 Zend_Http_Client 클래스입니다. 그것은 리다이렉트 등을 지원합니다.

0

당신은 내장 된 file_get_contents보다 더 나은 성능을 얻을 수 없을 것입니다. 실제로, 128 바이트만큼 짧은 문자열에 대한 상수 연결 (왜?)은 오히려 잘못 수행합니다.

  • 당신이 네트워크를 통해 제어 할 필요가

  • 당신이 직접 콘텐츠를 스트리밍 할 시간 초과 : 예를 들어, 스스로를 수행하거나 외부 라이브러리를 사용하는 이유가 HTTP를 들어

    소켓을 쌓는 대신에

그러나 성능은 그 중 하나가 아닙니다. 간단한 내장 PHP 함수는 네트워크 속도에 의해서만 제한 될 것이고 이것은 당신이 아무것도 할 수없는 것이다.

1

확실하지 않습니까? 시험합시다! 이 스크립트는 아래의 두 가지 방법을 사용하여 example.org 10 회를 열어 :

$t = microtime(true); 
$array = array(); 
for($i = 0; $i < 10; $i++) { 
    $source = file_get_contents('http://www.example.org'); 
} 
print microtime(true) - $t; 
print '<br>'; 
$t = microtime(true); 
$array = array(); 
for($i = 0; $i < 10; $i++) { 
    $socket = fsockopen('www.example.org', 80); 
    fputs($socket, 'GET/HTTP/1.0' . "\n"); 
    fputs($socket, 'Host: www.example.org' . "\n"); 
    fputs($socket, 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5' . "\n"); 
    fputs($socket, 'Connection: close' . "\n\n"); 
    $source = ''; 
    while(!feof($socket)) { 
     $source .= fgets($socket, 128); 
    } 
    fclose($socket); 
} 
print microtime(true) - $t; 

1 실행 :

file_get_contents: 3.4470698833466 
fsockopen: 6.3937518596649 

2 실행 : 그래서

file_get_contents: 3.5667569637299 
fsockopen: 6.4959270954132 

3 실행

file_get_contents: 3.4623680114746 
fsockopen: 6.4249370098114 

이후 file_get_contents 더 빠르고 간결합니다. 나는 그것을 승자로 선언 할 것입니다!

관련 문제