Обработка задержек при получении файлов с удаленного сервера в PHP
Я работаю с PHP для доступа к файлам и фотографиям с удаленных серверов. Я в основном использую функции file_get_contents() и copy().
Иногда доступ к небольшому текстовому файлу или фотографии происходит почти мгновенно, но в других случаях кажется, что он "застревает" на минуту в одном и том же файле. И иногда это действительно приводит к зависанию моего скрипта, и даже когда я останавливаю скрипт, Apache остается заблокированным в течение нескольких минут.
Я вполне готов принять тот факт, что интернет соединения могут быть неустойчивыми. Меня беспокоит то, что я восстанавливаюсь изящно и что я не разбиваю Apache - функция PHP set_time_limit() возвращает только фатальную ошибку. Кроме того, в руководстве по PHP есть примечание о том, что время, затрачиваемое на потоковые операции, не влияет на время выполнения скрипта.
Как я могу восстановиться после таких проблем с подключением и позволить моему сценарию продолжить работу? И почему это может привести к зависанию Apache?
Спасибо, Брайан
1 answers
$options = array( 'http' => array(
'user_agent' => 'Firefox wannabe',
'max_redirects' => 1,
'timeout' => 10,
) );
$context = stream_context_create( $options );
$content = file_get_contents( $url, false, $context );
Взгляните на stream_context_create
и Параметры контекста HTTP. Приведенный выше код установит тайм-аут для соединения и разрешит одно перенаправление.
Это должно предотвратить достижение тайм-аута.
Длительные задержки могут быть вызваны сетью или удаленным сервером, имеющим брандмауэр, запрещающий вам захватывать слишком много файлов одновременно, или неисправным DNS-сервером или маршрутизатором на пути к удаленному хосту. В качестве предложения вам следует локально кэшировать загруженные файлы, поэтому при следующем обновлении файлы будут обрабатываться локально, а не в большой широкой сети.