2

file_get_contentsを使用してWebページのソースを取得できることは知っていますが、最も効率的な方法を知りたいと思います。

ずっと前に作成した、次のようなものを使用する古いクラスがあります。

    $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

5 に答える 5

4

file_get_contents()最良かつ最も効率的な方法です。ただし、どちらの場合も、ボトルネックはプロセッサではなくネットワークであるため、大きな違いはありません。コードの可読性も問題になるはずです。

このベンチマークも検討してください:http ://www.ebrueggeman.com/php_benchmarking_fopen.php

于 2009-03-29T19:42:28.033 に答える
3

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

より複雑なケースなどを処理するものが必要な場合は、phpcURLを使用してください。

于 2009-03-29T19:42:16.020 に答える
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より速く、より簡潔なので、私はそれを勝者と宣言するつもりです!

于 2009-03-30T01:40:18.487 に答える
0

ZendFrameworkのZend_Http_Clientクラスも確認してください。リダイレクトなどをサポートします。

于 2009-03-29T19:56:57.593 に答える
0

このような自作コードを使用した組み込みのfile_get_contentsよりも優れたパフォーマンスは得られません。実際、128バイト(?なぜ?)という短い文字列の定数連結は、かなり悪いパフォーマンスを示します。

HTTPの場合、自分で行うか、外部ライブラリを使用する理由があります。次に例を示します

  • ネットワークタイムアウトを制御する必要があります

  • コンテンツを蓄積するのではなく、ソケットから直接ストリーミングしたい

しかし、パフォーマンスはそれらの1つではありません。単純な組み込みのPHP関数は、ネットワーク速度によってのみ制限されます。これは、何もできないことです。

于 2009-03-30T01:26:34.337 に答える