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

StackOverflow https://stackoverflow.com/questions/1605063

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top