2009-03-29 8 views
2

Je sais que file_get_contents peut être utilisé pour récupérer la source d'une page Web, mais je veux savoir le moyen le plus efficace.Le moyen le plus efficace pour récupérer la source d'un site Web via PHP? (Demande GET)

J'ai une ancienne classe que je fait depuis longtemps qui utilise quelque chose comme ceci:

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

Est-ce la meilleure façon? Par le plus efficace, je veux dire renvoie les résultats les plus rapides.

Répondre

4

file_get_contents() est la meilleure et la plus efficace. Mais, de toute façon, il n'y a pas beaucoup de différence parce que le goulot d'étranglement est le réseau, pas le processeur. La lisibilité du code devrait également être une préoccupation.

cette référence Tenir compte ainsi: http://www.ebrueggeman.com/php_benchmarking_fopen.php

3

Le code que vous avez est probablement le moyen le plus rapide et le plus simple de faire ce dont vous parlez. Cependant, il n'est pas très flexible si vous voulez faire des tâches plus complexes (comme poster, ou supporter des choses HTTP 1.1 comme Content-Encoding et Transfer-Encoding).

Si vous voulez quelque chose qui va gérer des cas plus complexes et autres, utilisez php cURL.

0

Vérifiez aussi la classe Zend Framework Zend_Http_Client. Il prend en charge les redirections, etc.

0

Vous n'obtiendrez pas de meilleures performances que le fichier_get_contents intégré avec un code homebrew comme celui-ci. En effet, la concaténation constante sur des chaînes aussi courtes que 128 octets («pourquoi?) Fonctionnera plutôt mal.

Pour HTTP il sont raisons de le faire vous-même ou utiliser une bibliothèque externe, par exemple:

  • vous avez besoin de contrôle sur le réseau des délais d'attente

  • vous voulez diffuser du contenu directement à partir de la socket au lieu de l'accumuler

mais les performances n'en font pas partie; la fonction PHP intégrée simple sera limitée seulement par la vitesse du réseau, ce qui est quelque chose que vous ne pouvez rien faire.

1

Vous ne savez pas? Testons-nous! Le script ci-dessous ouvre example.org 10 fois en utilisant les deux méthodes:

$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ère manche:

file_get_contents: 3.4470698833466 
fsockopen: 6.3937518596649 

2ème manche:

file_get_contents: 3.5667569637299 
fsockopen: 6.4959270954132 

3ème course

file_get_contents: 3.4623680114746 
fsockopen: 6.4249370098114 

Ainsi, depuis file_get_contents est plus rapide et plus concis je vais le déclarer le gagnant!

Questions connexes