Более быстрая альтернатива 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 не возвращает никаких данных, просто заголовков, поэтому может быть достаточно для запуска удаленных заданий и не дожидаться полного вывода.