2009-03-29 5 views
2

Ich weiß, dass file_get_contents verwendet werden kann, um die Quelle einer Webseite abzurufen, aber ich möchte den effizientesten Weg wissen.Der effizienteste Weg, um die Quelle einer Website über PHP zu erhalten? (GET Request)

Ich habe eine alte Klasse habe ich vor langer Zeit, dass so etwas wie dies verwendet:

$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); 

Ist dies der beste Weg? Am effizientesten sind die schnellsten Ergebnisse.

Antwort

4

file_get_contents() ist der beste und effizienteste Weg. Es gibt jedoch keinen großen Unterschied, denn der Engpass ist das Netzwerk, nicht der Prozessor. Code-Lesbarkeit sollte auch ein Anliegen sein.

Betrachten Sie diese Benchmark auch: http://www.ebrueggeman.com/php_benchmarking_fopen.php

3

Der Code, den Sie haben, ist wahrscheinlich die schnellste und einfachste Art zu tun, wovon Sie sprechen. Es ist jedoch nicht sehr flexibel, wenn Sie komplexere Aufgaben ausführen möchten (wie das Posten oder Unterstützen von HTTP 1.1-Inhalten wie Content-Encoding und Transfer-Encoding).

Wenn Sie etwas haben möchten, das komplexere Fälle und ähnliches behandelt, verwenden Sie PHP cURL.

0

Sie werden keine bessere Leistung als die integrierte file_get_contents mit Homebrew-Code wie folgt erhalten. In der Tat wird die konstante Verkettung von Strings von nur 128 Bytes (? Warum?) Ziemlich schlecht sein.

Für HTTP es sind Gründe es selbst zu tun oder eine externe Bibliothek verwenden, zum Beispiel:

  • Sie die Kontrolle über das Netzwerk benötigen Timeouts

  • Sie Inhalte streamen von der direkt wollen Buchse statt Anhäufung

aber Leistung ist nicht einer von ihnen; Die einfache integrierte PHP-Funktion wird nur durch die Netzwerkgeschwindigkeit begrenzt, etwas, womit Sie nichts anfangen können.

1

Nicht sicher? Lass uns testen! Das Skript unten öffnet example.org 10mal beiden Methoden verwenden:

$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. Lauf:

file_get_contents: 3.4470698833466 
fsockopen: 6.3937518596649 

2. Lauf:

file_get_contents: 3.5667569637299 
fsockopen: 6.4959270954132 

3. Lauf

file_get_contents: 3.4623680114746 
fsockopen: 6.4249370098114 

So seit file_get_contents ist schneller und prägnanter Ich werde es zum Sieger erklären!

Verwandte Themen