Более быстрая альтернатива file_get_contents()

В настоящее время я использую file_get_contents() для отправки данных GET в массив сайтов, но после выполнения этой страницы я получаю эту ошибку:

Неустранимая ошибка: превышено максимальное время выполнения на 30 секунд

Все, что я действительно хочу сделать script, это начать загрузку веб-страницы, а затем уйти. Для полной загрузки каждой веб-страницы может потребоваться до 5 минут, и мне не нужно ее полностью загружать.

Вот что я сейчас имею:

        foreach($sites as $s) //Create one line to read from a wide array
        {
                file_get_contents($s['url']); // Send to the shells
        }

EDIT: для устранения путаницы этот script используется для запуска скриптов на других серверах, которые не возвращают данные.

EDIT: теперь я пытаюсь использовать cURL, чтобы сделать трюк, установив тайм-аут в одну секунду, чтобы заставить его отправить данные, а затем остановить. Вот мой код:

        $ch = curl_init($s['url']); //load the urls
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //Only send the data, don't wait.
        curl_exec($ch); //Execute
        curl_close($ch); //Close it off.

Возможно, я неправильно установил параметр. Когда мы говорим, я просматриваю некоторые руководства. Просто дайте вам обновление. Спасибо вам всем, кто помогает мне до сих пор.

EDIT: Ах, нашел проблему. Я использовал CURLOPT_CONNECTTIMEOUT вместо CURLOPT_TIMEOUT. Упс.

Однако теперь скрипты не запускаются. Каждый из них использует ignore_user_abort (TRUE); поэтому я не могу понять проблему

Да, поцарапайте это. Работает сейчас. Большое спасибо всем

Ответы

Ответ 1

Существует много способов решить эту проблему.

Вы можете использовать cURL с функциями curl_multi_ * для асинхронного выполнения запросов. Или используйте cURL обычным способом, но используя 1 в качестве предела тайм-аута, чтобы он запрашивал и возвращал таймаут, но запрос будет выполнен.

Если у вас нет cURL, вы можете продолжить использование file_get_contents, но процессы forking (не так классно, но работают), используя что-то вроде ZendX_Console_Process_Unix, чтобы избежать ожидания между каждым запросом.

Ответ 2

Повторите свое обновление, которое вам нужно только для запуска операции:

Вы можете попробовать использовать file_get_contents с таймаутом. Это приведет к вызову удаленного script, но соединение будет прекращено через n секунд (например, 1).

Если удаленный script настроен так, что он продолжает работать, даже если соединение прерывается (в PHP, который будет ignore_user_abort), он должен работать.

Попробуйте. Если это не сработает, вам не придется увеличивать ваш time_limit или использовать внешний исполняемый файл. Но из того, что вы говорите, вам просто нужно сделать запрос - это должно сработать. Вы даже можете попытаться установить тайм-аут на 0, но я не верю в это.

Из здесь:

<?php
$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 1
        )
    )
);
file_get_contents("http://example.com/", 0, $ctx);
?>

Чтобы быть справедливым, ответ Криса уже включает эту возможность: curl также имеет тайм-аут.

Ответ 3

Как упоминал Франко, и я не уверен, что вас подхватили, вы специально хотите использовать функции curl_multi, а не обычные завитки. Это упаковывает несколько объектов curl в объект curl_multi и выполняет их одновременно, возвращая (или не в вашем случае) ответы по мере их поступления.

Пример http://php.net/curl_multi_init

Ответ 4

это не файл_get_contents(), который потребляет столько времени, сколько самого сетевого соединения.
Подумайте о том, чтобы не передавать данные GET в массив сайтов, а создавать rss и получать данные RSS.

Ответ 5

Я не полностью понимаю смысл вашего script. Но вот что вы можете сделать:

  • Чтобы быстро избежать фатальной ошибки, вы можете просто добавить set_time_limit (120) в начале файла. Это позволит запустить script в течение 2 минут. Конечно, вы можете использовать любое число, которое вы хотите, и 0 для бесконечного.
  • Если вам просто нужно вызвать URL-адрес, и вы не "заботитесь" о результатах, вы должны использовать cUrl в асинхронном режиме. В этом случае любой вызов URL-адреса не будет ждать завершения. И вы можете позвонить им очень быстро.

BR.

Ответ 6

Если удаленные страницы загрузятся до 5 минут, ваши файловые_компьюты будут сидеть и ждать 5 минут. Есть ли способ изменить удаленные сценарии на fork в фоновый процесс и сделать там тяжелую обработку? Таким образом, ваш первоначальный хит будет возвращен почти сразу, и не придется ждать периода запуска.

Другая возможность - исследовать, будет ли запрос HEAD делать трюк. HEAD не возвращает никаких данных, просто заголовков, поэтому может быть достаточно для запуска удаленных заданий и не дожидаться полного вывода.