2009-03-29 7 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); 

はこれが最善の方法ですが?最も効率的であるということは、最も速い結果を返すことを意味します。

答えて

4

file_get_contents()が最も効果的です。しかし、どちらの方法でも、ボトルネックはネットワークであり、プロセッサではないので、大きな違いはありません。コードの可読性も懸念事項です。

は、同様に、このベンチマークを考えてみましょう: http://www.ebrueggeman.com/php_benchmarking_fopen.php

3

あなたが持っているコードは、おそらくあなたが話していることを行う最も簡単で簡単な方法です。しかし、より複雑なタスク(投稿やContent-EncodingやTransfer-EncodingのようなHTTP 1.1のサポートなど)をしたい場合はあまり柔軟ではありません。

もっと複雑なケースなどを扱うものをお探しの場合は、cURLを使用してください。

0

チェックもZend FrameworkのクラスのZend_Http_Client。それはリダイレクトなどをサポートします。

0

このような自作コードを持つ組み込みのfile_get_contentsよりも優れたパフォーマンスは得られません。確かに、文字列の定数連結は、128バイト(?why?)と短いですが、どちらかといえばひどいことになります。

  • あなたがネットワーク経由で制御する必要が

  • は、あなたから直接コンテンツをストリーミングするタイムアウト:は、例えば、それを自分で行うか、外部ライブラリを使用する理由があるHTTPの場合

    ソケットを累積する代わりに

ですが、パフォーマンスはその1つではありません。単純な組み込みの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; 

第一の実行:

file_get_contents: 3.4470698833466 
fsockopen: 6.3937518596649 

第二の実行:だから

file_get_contents: 3.5667569637299 
fsockopen: 6.4959270954132 

第三の実行

file_get_contents: 3.4623680114746 
fsockopen: 6.4249370098114 

以来file_get_contents私はそれを勝者と宣言するつもりです!

関連する問題