Самый эффективный способ получить источник веб-сайта через PHP? (ПОЛУЧИТЬ запрос) - PullRequest
2 голосов
/ 29 марта 2009

Я знаю, что file_get_contents можно использовать для получения источника веб-страницы, но я хочу знать наиболее эффективный способ.

У меня есть старый класс, который я сделал давным-давно, который использует что-то вроде этого:

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

Это лучший способ? Под наиболее эффективным я имею в виду самые быстрые результаты.

Ответы [ 5 ]

4 голосов
/ 29 марта 2009

file_get_contents() - лучший и самый эффективный способ. Но в любом случае, нет большой разницы, потому что узким местом является сеть, а не процессор. Читаемость кода также должна быть проблемой.

Рассмотрим также и этот тест: http://www.ebrueggeman.com/php_benchmarking_fopen.php

3 голосов
/ 29 марта 2009

Код, который у вас есть, вероятно, самый быстрый и простой способ сделать то, о чем вы говорите. Тем не менее, он не очень гибок, если вы хотите выполнять более сложные задачи (например, публикацию сообщений или поддержку HTTP 1.1, таких как Content-Encoding и Transfer-Encoding).

Если вы хотите что-то, что будет обрабатывать более сложные случаи и тому подобное, используйте php cURL .

1 голос
/ 30 марта 2009

Не уверен? Давайте проверим! Сценарий ниже открывает 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 быстрее и лаконичнее, я объявлю его победителем!

0 голосов
/ 30 марта 2009

Вы не добьетесь лучшей производительности, чем встроенный файл file_get_contents с таким кодом домашнего варки, как этот. Действительно, константа конкатенации строк длиной до 128 байт («почему») будет работать довольно плохо.

Для HTTP есть причины сделать это самостоятельно или использовать внешнюю библиотеку, например:

  • вам нужно контролировать время ожидания сети

  • вы хотите передавать контент прямо из сокета, а не накапливать его

но производительность не входит в их число; простая встроенная функция PHP будет ограничена только скоростью сети, с которой вы ничего не можете поделать.

0 голосов
/ 29 марта 2009

Проверьте также класс Zend Framework Zend_Http_Client. Он поддерживает перенаправления и т. Д.

...