Обработка задержек при получении файлов с удаленного сервера в PHP


Я работаю с PHP для доступа к файлам и фотографиям с удаленных серверов. Я в основном использую функции file_get_contents() и copy().

Иногда доступ к небольшому текстовому файлу или фотографии происходит почти мгновенно, но в других случаях кажется, что он "застревает" на минуту в одном и том же файле. И иногда это действительно приводит к зависанию моего скрипта, и даже когда я останавливаю скрипт, Apache остается заблокированным в течение нескольких минут.

Я вполне готов принять тот факт, что интернет соединения могут быть неустойчивыми. Меня беспокоит то, что я восстанавливаюсь изящно и что я не разбиваю Apache - функция PHP set_time_limit() возвращает только фатальную ошибку. Кроме того, в руководстве по PHP есть примечание о том, что время, затрачиваемое на потоковые операции, не влияет на время выполнения скрипта.

Как я могу восстановиться после таких проблем с подключением и позволить моему сценарию продолжить работу? И почему это может привести к зависанию Apache?

Спасибо, Брайан

Author: Brian, 2009-10-22

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

 3
Author: Quamis, 2014-01-12 09:53:25