2016-04-05 9 views
0

Ich baue eine PHP-Website, die JSON-Dateien von MySociety EveryPolitician herunterlädt. Einige dieser Dateien sind klein, während andere sehr massiv sind. Hier sind zwei Beispiele für die typische Anforderung, die ich mache:PHP file_get_contents Gibt 504 bei größeren Dateien zurück

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

Und

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

Die erste Zeile funktioniert gut, die ich glaube, ist wegen der geringen Größe der Datei angefordert wird, aber Die zweite Zeile wird für immer im Browser geladen, bevor ein Gateway-Timeout-Fehler zurückgegeben wird (504).

Wenn ich meinen Browser auf die zweite URL zeige, lädt es gut (obwohl nach ein paar Sekunden, immerhin ist es ziemlich groß). Momentan läuft das Skript auf meinem lokalen Rechner, es gibt also keinen Unterschied in der Bandbreite oder Internetgeschwindigkeit. Wie Sie sehen können, stammen beide Dateien von GitHub.

Verwirre mich mehr ist, dass die zweite Zeile tatsächlich einmal gearbeitet hat, vor ein paar Tagen.

Ist dies nur eine Einschränkung von PHP's file_get_contents()? Gibt es eine Möglichkeit, um es mit file_get_contents() umgehen oder gibt es eine andere Bibliothek, die in diesem Fall besser funktionieren würde?

+2

curl ist robuster und konfigurierbarer als file_get_contents –

+0

und [Guzzle] (https://packagist.org/packages/guzzlehttp/guzzle) ist ein benutzerfreundlicherer Wrapper um Curl. – Sammitch

Antwort

1

Sie könnten versuchen, das Standard-Socket-Timeout als solche Einstellung:

ini_set('default_socket_timeout', 360); 

, die den file_get_contents() 6 Minuten würden seine Verbindung zu versuchen. Darüber hinaus können Sie einen Kontext Array erstellen und es entlang der file_get_contents() Funktion übergeben, die es so hatte machen würden Sie nicht den ini Wert ala ändern:

$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); 

hoffe, das hilft

Verwandte Themen