2016-04-05 3 views
0

Я создаю сайт PHP, который загружает файлы JSON из EveryPolitician от MySociety. Некоторые из этих файлов небольшие, а другие - супермассовые. Вот два примера типичного запроса, что я делаю:PHP file_get_contents Возвращает 504 на больших файлах

$g = file_get_contents("https://cdn.rawgit.com/everypolitician/everypolitician-data/65c4534/data/US_Virgin_Islands/Legislature/ep-popolo-v1.0.json"); 

И

$g = file_get_contents("https://cdn.rawgit.com/everypolitician/everypolitician-data/65c4534/data/UK/Commons/ep-popolo-v1.0.json"); 

Первая линия работает отлично, который я считаю, это из-за малого масштаба файла запрашивается, но вторая строка загружается навсегда в браузере, прежде чем возвращать ошибку тайм-аута шлюза (504).

Если я укажу свой браузер на второй URL-адрес, он загрузится нормально (хотя через несколько секунд, в конце концов, он довольно большой). Пока скрипт работает на моей локальной машине, поэтому нет никакой разницы в пропускной способности или скорости интернета. Как вы можете видеть, оба файла находятся в GitHub.

Смущает меня еще в том, что вторая линия действительно работала один раз, пару дней назад.

Это просто ограничение PHP_file_contents()? Есть ли способ обойти это с помощью file_get_contents() или есть ли другая библиотека, которая будет работать лучше в этом случае?

+2

завитка более надежный и настраиваемый, чем file_get_contents –

+0

и [Guzzle] (https://packagist.org/packages/guzzlehttp/guzzle) - более удобная оболочка вокруг завитка. – Sammitch

ответ

1

Вы можете попробовать установить тайм-аут сокета по умолчанию, как, например:

ini_set('default_socket_timeout', 360); 

Что бы дать file_get_contents() 6 минут, чтобы попытаться его подключения. Кроме того, вы можете создать контекст массив и передать его вместе с file_get_contents() функцией, которая сделает это так, Вы не должны изменить INI значения ала:

$context = stream_context_create(array( 
    'http' => array( 
     'timeout' => 360 
     ) 
    ) 
); 
file_get_contents("https://cdn.rawgit.com/everypolitician/everypolitician-data/65c4534/data/UK/Commons/ep-popolo-v1.0.json", 0, $context); 

Надеется, что это помогает