2009-02-23 7 views
30

Hallo ich bin ziemlich neu in PHP, ich habe ein Formular für sehr große CSV-Dateien erstellt auf meinem Server hochgeladen werden. Jemand hat mir gegenüber erwähnt, dass der Browser eine Zeitüberschreitung haben kann, weil die hochgeladene Datei zu groß ist. Ist das wahr? und wenn ja, kann es verhindert werden?Kann Datei-Upload-Timeout in PHP hochladen?

Danke für Ihre Hilfe!

Antwort

50

Sie benötigen einen richtigen Wert für die folgenden Einstellungen in der php.ini: (! nicht max_execution_time)

  1. max_input_time
  2. upload_max_filesize
  3. post_max_size

und vielleicht

  1. memory_limit
+6

Die PHP-Dokumentation für max_input_time sagt: "Es wird vom Moment des Eingangs aller Daten auf dem Server bis zum Start der Skriptausführung gemessen." Warum sollte die Dateigröße einen Unterschied machen? Alle Daten wurden empfangen, bevor dieser Timer gestartet wird. – Oscar

+0

Nach dem Testen bestätige ich, dass 'max_input_time' anscheinend keine Auswirkungen auf dieses Problem hat. –

1

Ja, es ist wahr. Das Hochladen von Dateien erfolgt über eine POST-Anfrage, und Anfragen unterliegen im Allgemeinen einer Zeitüberschreitung. Sie sollten Ihre Umgebung für ein längeres Anforderungstimeout konfigurieren können.

2

Ein Skript kann standardmäßig etwa 30 Sekunden lang ausgeführt werden. Sie können die set_time_limit() function verwenden, um dies zu ändern. Wenn Ihr Benutzer große Dateien hochladen muss, müssen Sie außerdem die Werte post_max_size und/upload_max_filesize in Ihrer php.ini-Datei ändern.

Wenn Sie Ihr Zeitlimit global verlängern möchten, können Sie die maximale Ausführungszeit in php.ini ändern.

+0

brilliant, danke dafür! Ich wusste nicht einmal über post_max_size oder upload_max_file_size! sehr geschätzt –

+1

set_time_limit wirkt sich auf die gleiche Einstellung wie max_execution_time in php.ini aus. Das Dokument sagt "Die maximale Ausführungszeit wird nicht von Systemaufrufen, Stream-Operationen usw. beeinflusst." Wird der Dateiupload als "Stream-Operation" gezählt? Wenn dies der Fall ist, scheint diese Einstellung nicht hilfreich zu sein. – Oscar

1

Es Timeouts nicht nur, dass Probleme verursachen können. Es gibt einige Einschränkungen für die maximale Größe der Datei, die hochgeladen werden kann. Diese Grenzen können in der php.ini-Datei geändert werden:

post_max_size
upload_max_filesize memory_limit

Check out http://uk.php.net/ini.core für weitere Einzelheiten.

27

Es gibt einige Konfigurationsanweisungen, die großen Uploads verursachen kann fehlschlagen, wenn ihre Werte zu klein sind:

PHP

  • max_input_time Maximale Zeit in Sekunden, die ein Skript erlaubt die Eingangsdaten zu analysieren, wie POST, GET und Datei-Uploads
  • upload_max_filesize Maximale Größe einer hochgeladenen Datei.
  • post_max_size Maximale Größe der Postdaten zulässig.

Apache

  • TimeOut Zeit Betrag der Server für bestimmte Ereignisse wartet, bevor eine Anfrage
  • LimitRequestBody Beschränkt die Gesamtgröße des HTTP-Anforderung Körpers andernfalls vom Client gesendet

Es gibt wahrscheinlich einige mehr als Dies.

+0

Ich habe keine Ahnung, wo über die Apache-Einstellungen zu gehen auch gehen :( –

+0

Fragen Sie Ihren Anbieter, ob diese Einstellungen zum Hochladen von großen Dateien geeignet sind. – Gumbo

3

Wenn sehr große Dateien hochladen, müssen Sie 4 Konfigurationsvariablen ändern:

  • upload_max_filesize
  • post_max_size
  • memory_limit
  • time_limit

Frist zur Laufzeit werden erhöht mit set_time_limit().

+0

Zu meiner Kenntnis gibt es keine solche Anweisung in PHP - time_limit. Set_time_limit() setzt max_execution_time. – jayarjo

4

Ein guter Weg, um die schlechte Handhabung von großen Datei-Uploads in PHP zu umgehen, ist die Verwendung eines Uploaders wie JUpload, die die Datei in Stücke teilen wird, bevor sie gesendet werden. Dies hat auch den Vorteil für Ihre Benutzer, dass sie beim Hochladen ein korrektes Fortschrittsfeedback erhalten und mehrere Dateien gleichzeitig hochladen können.

1

Meine Antwort bezieht sich nicht direkt auf Ihre ursprüngliche Frage, aber wenn Sie einen Reverseproxy-Lastenausgleich vor Ihrem PHP-Skript haben, kann der Load Balancer Timeouts oder große Uploads blockieren. Überprüfen Sie immer die Konfiguration Ihres Load Balancers, wenn Sie Dateiuploads unterstützen. Genau wie PHP sind die meisten Load-Balancer-Standardeinstellungen für Uploads ziemlich klein.

1

konnte ich dieses Problem lösen die folgenden Einstellungen verwenden, können Sie verschiedene Werte verwenden, aber Sie erhalten die Idee:

Für meinen Server, lege ich diese Zeilen in einer „.user.ini“ Datei im Skript Verzeichnis, der Server für eine andere Datei aussehen kann, wenn Sie eine phpinfo (‚user_ini.filename‘) auf dem Server zu tun wird es die Datei, die Sie Ihre Werte in

max_execution_time = 1800 
max_input_time = -1 
post_max_size = 100M 
upload_max_filesize = 100M 
memory_limit = 256M 
0

setzen müssen ausspucken zu Beim Wechsel all Die obigen Parameter scheinen keinen Unterschied zu machen, es kann sein, dass ein HTML-Formular irgendwo den Namen MAX_FILE_SIZE als verstecktes Feld enthält.

<input type="hidden" name="MAX_FILE_SIZE" value="10000000">

In dem obigen Beispiel wird keine Datei über 10 MB hochgeladen werden.