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

В настоящее время я использую file_get_contents () для представления, ПОЛУЧАЮТ данные к массиву сайтов, но после выполнения страницы я получаю эту ошибку:

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

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

Вот то, что я в настоящее время имею:

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

Править: Для очистки любого беспорядка этот сценарий используется для запуска сценариев на других серверах, тот возврат никакие данные.

Править: Я теперь пытаюсь использовать ЗАВИХРЕНИЕ для добиваний цели путем установки тайм-аута одной секунды, чтобы заставить его отправить данные и затем остановиться. Вот мой код:

        $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.

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

Править: А-ч, найденный проблемой. Я использовал CURLOPT_CONNECTTIMEOUT вместо CURLOPT_TIMEOUT. Ой.

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

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

13
задан Alix Axel 20 May 2010 в 17:19
поделиться

5 ответов

Там Есть много способов решить эту проблему.

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

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

6
ответ дан 2 December 2019 в 00:45
поделиться

Так много времени занимает не file_get_contents (), а само сетевое соединение.
Рассмотрите возможность не отправлять данные GET на массив сайтов, а создать RSS-канал и позволить им получать данные RSS.

1
ответ дан 2 December 2019 в 00:45
поделиться

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

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

1
ответ дан 2 December 2019 в 00:45
поделиться

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

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

BR.

1
ответ дан 2 December 2019 в 00:45
поделиться

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

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

Если удаленный сценарий настроен так, что он продолжает работать, даже если соединение прервано (в 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 также имеет переключатель тайм-аута.

2
ответ дан 2 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: