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

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

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

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

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

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

1 ответ

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

Другие вопросы по тегам