PHP Upload - 500 Interner Serverfehler

8

Das Problem

Beim Hochladen von Dateien mit einer Größe von ca. 8 MB oder mehr erhalte ich einen internen Serverfehler von 500.

  1. Alle PHP Einstellungen in php.ini sind korrekt
  2. maxAllowedContentLength wurde in der Datei web.config
  3. festgelegt

Server Info

Wie man wahrscheinlich an maxAllowedContentLength erkennen kann, verwende ich IIS 7.5 , mit FastCGI und PHP 5.3.17

Zusätzliche Informationen

Ich habe so viele verschiedene Dinge ausprobiert, um das funktionieren zu lassen, aber ich finde das Problem einfach nicht.

Ich habe jedoch die folgenden Informationen gefunden, die helfen könnten, die Wurzel dieses Problems herauszufinden:

  1. Beim Hochladen von Dateien (größere) mit dem Medien-Wiki, das ich auf dem Server habe, erhalte ich den gleichen Fehler, dies zeigt, dass es sich nicht um einen Fehler in meinem Code handelt.
  2. Am wichtigsten - Ich habe es geschafft, eine 18MB-Datei in den Plesk File Manager hochzuladen. Dies bedeutet natürlich, dass Plesk dieses Config-Problem umgehen konnte. Ich habe versucht, alle Einstellungen von Plesk Control Panel auf diese Domäne in IIS zu kopieren, aber das scheint nicht zu funktionieren.
  3. Der Fehler wird zurückgegeben, bevor das Skript ausgeführt wird, da ich oben versucht habe, exit; zu schreiben, um zu versuchen, einen leeren Bildschirm zu erhalten, aber dies wird ignoriert und der Fehler 500 wird zurückgegeben.

Ich denke, dass das Problem im configure command -Teil der PHP-Konfiguration liegt , wenn ich die Handler-Zuordnung der .php -Dateien ändere, um Plesk php-cgi.exe anstelle von Normalerweise bekomme ich den 500 Internal Error nicht. Abgesehen davon kann ich es nicht auf dieser PHP-Version belassen, da es Plesks eigenes exe ist und es weitere Konfigurationsprobleme gibt.

Der Grund, warum ich denke, dass es mit dem configure-Befehl zu tun hat, liegt einfach daran, dass dieser sich sehr stark von einem phpinfo() zum anderen unterscheidet.

Wenn Sie Ideen oder Vorschläge haben, schreiben Sie sie bitte. Ich habe alles nach meinem Wissen versucht und kann das anscheinend nicht beheben. Wenn es nur Linux wäre ...

Vielen Dank im Voraus

UPDATE 1

Vergessen, hinzuzufügen, es werden keine Fehler im PHP-Fehlerprotokoll zurückgegeben. Wie bei IIS-Fehlern weiß ich nicht, wo ich suchen soll

UPDATE 2

Das habe ich in meine web.config Datei geschrieben:

%Vor%

UPDATE 3

Mit Ihrer Hilfe haben wir es geschafft, den Fehler von IIS angezeigt zu bekommen. Dies ist, was ich erhalte:

  

PHP Warnung: POST Content-Length von 12221448 Byte überschreitet das Limit   von 8388608 Bytes in Unbekannt in Zeile 0

Hat das mit post_max_size zu tun?

UPDATE 4

PHP Einstellungen wie folgt (von phpinfo() ):

%Vor%

UPDATE 5

Schließlich, für den Fall, dass irgendjemand potenzielle Probleme entdecken kann, ist Plesk in der Lage, große Dateien absolut gut zu laden, also nahm ich an, dass ihre php-cgi.exe anders kompiliert wurde. Wenn ich ein phpinfo () ihrer Konfiguration lese, war die configure command Information sehr unterschiedlich:

Meine Konfiguration:

  

cscript / nologo configure.js "--enable-snapshot-build"   "--disable-isapi" "--enable-debug-pack" "--without-mssql"   "--without-pdo-mssql" "--without-pi3web"   "--with-pdo-oci = C: \ php-sdk \ oracle \ instantclient10 \ sdk, freigegeben"   "--with-oci8 = C: \ php-sdk \ oracle \ instantclient10 \ sdk, freigegeben"   "--with-oci8-11g = C: \ php-sdk \ oracle \ instantclient11 \ sdk, freigegeben"   "--enable-object-out-dir = .. / obj /" "--fähig-com-dotnet = geteilt"   "--with-mcrypt = statisch" "--disable-static-analyze"

Plesk-Konfiguration:

  

cscript / nologo configure.js "--enable-debug-pack" "--deable-cli"   "--enable-cgi" "--able-isapi" "--able-one-shot" "--able-pdo"   "--enable-intl" "--with-openssl = freigegeben" "--with-pdo-odbc"   "--with-iconv" "--with-xml" "--with-xsl" "--with-mysql"   "--with-mysqlnd" "--mit-mysqli" "--mit-pdo-sqlite"   "--with-pdo-mysql" "--mit-curl = geteilt" "--enable-mbstring"   "--enable-mbregex" "--with-imap = shared" "--able-sockets"   "--enable-shmop" "- machbare Seife"

UPDATE (ANTWORT) Das ist extrem komisch, da die phpinfo() info eine Sache sagt, aber offensichtlich ignoriert wird, nicht sicher warum.

Wenn ich die post_max_size in Plesk für diese bestimmte Domain / Subdomain ändere, dann wird nichts geändert (obwohl es sich anscheinend in phpinfo() geändert hat). Wenn ich jedoch die post_max_value in der php.ini ändere, behebt dies das Problem.

Der Grund, warum dies keine gute Möglichkeit ist, dies zu beheben, liegt einfach darin, dass bei der Aktualisierung von Plesk die php.ini überschrieben wird, wenn PHP aktualisiert wird und die an der php.ini vorgenommenen Änderungen verloren gehen. Das bedeutet, dass jedes Mal, wenn Plesk aktualisiert wird, ich Änderungen an der php.ini vornehmen muss. Aus diesem Grund bietet Plesk die Möglichkeit, PHP-Einstellungen zu ändern, ohne Änderungen an der php.ini vorzunehmen.

Kann jemand daran denken, warum PHP den lokalen Wert ignoriert und zu dem Wert im PHP zurückkehrt.ini, obwohl die php.ini angibt, dass der lokale Wert anders ist?

    
Ben Carey 22.10.2012, 08:56
quelle

4 Antworten

3

Wenn Sie sich den Quellcode von PHP ansehen, können Sie sehen in der Datei php-5.4.8-src\main\rfc1867.c Zeile 706-709 dies:

%Vor%

Dasselbe gilt auch für die Datei php-5.4.8-src\main\SAPI.c . Die Nachricht PHP Warning: POST Content-Length of 12221448 bytes exceeds the limit of 8388608 bytes in Unknown on line 0 entspricht also der Einstellung post_max_size. Sie haben von der Verwendung von phpinfo () bestätigt, dass Sie diese Einstellung korrekt konfiguriert haben, aber sie scheint trotzdem den Standardwert von 8M zu verwenden.

Warum, siehe Dieser Thread :

  

Wie sich herausstellt, können Sie unter Windows nur ini-Anweisungen festlegen   markiert PHP_INI_USER pro Verzeichnis. Unglücklicherweise,    upload_max_filesize und post_max_size sind beide PHP_INI_PERDIR .   Aus den PHP-Dokumenten unter    Ссылка

     
    

Die Einstellungen für das Verzeichnis wären für jedes Skript aktiv, das von diesem Verzeichnis oder einem Unterverzeichnis davon ausgeführt wird. Die Werte     Unter dem Schlüssel sollte der Name der PHP-Konfigurationsanweisung stehen     und der Zeichenfolgenwert. PHP-Konstanten in den Werten werden nicht analysiert.      Allerdings können nur Konfigurationswerte, die in PHP_INI_USER geändert werden können, auf diese Weise gesetzt werden, PHP_INI_PERDIR Werte nicht.

  
     

Also, obwohl Plesk eine Schnittstelle hat, um diese Direktiven zu ändern, und   auch wenn phpinfo() sie aufgreift, sie ändern nichts   die tatsächlichen maximalen Upload-Größen. Plesk sollte dir keine Änderungen erlauben   die unter Windows und phpinfo() sollten die Änderung nicht melden, aber   Was kannst du tun?

Also, es ist post_max_size, und es muss auf php.ini eingestellt werden. Die Plesk-Einstellung funktioniert einfach nicht, obwohl phpinfo das Gegenteil sagt. Ich habe auch einen Fehlereintrag zum phpinfo-Verhalten geöffnet, da es keinen Eintrag dafür zu geben scheint.

    
eis 22.10.2012, 09:59
quelle
2

Dies ist ein ziemlich häufiger Fehler und liegt daran, dass die Größe der hochgeladenen Daten nicht mit der Dateigröße übereinstimmt: selbst wenn die maximale POST-Größe von der -Datei nicht überschritten wird Größe , könnte es durch die hochgeladene Datengröße sein.

Siehe diese Seite im PHP-Handbuch.

%Vor%

Eine weitere Quelle von Problemen (für sehr große Texte) ist die UTF8-Codierung. Vielleicht finden Sie sich mit einem "sechs Megabyte" TEXTAREA, das tatsächlich 6 Mega * Zeichen * ist, und mit internationalen Codepunkten könnte es zu sagen, etwa 8,2 Megabyte. So erhalten Sie eine scheinbar widersprüchliche Situation von "sechs Megabyte Daten überschreiten die konfigurierte 8 Megabyte Grenze".

Aktualisieren

Sie melden zwei scheinbar widersprüchliche Fakten:

%Vor%

und

%Vor%

Aus dem PHPINFO geht hervor, dass das Limit für POST 64M ist. Der Fehler besagt jedoch, dass das Limit 8M (Standard) ist. So scheint es mir, dass Ihr Code spricht mit zwei verschiedenen PHP-Implementierungen (Zwei verschiedene virtuelle Hosts? Eine CGI-Version und eine nicht-CGI-Version auf dem gleichen Host? Zwei verschiedene Maschinen ?)

    
LSerni 22.10.2012 09:44
quelle
0

IIS wird die FastCGI-Prozesse erneut verwenden. Sie müssen alle alten Prozesse beenden, um die php.ini neu zu laden.

Bearbeiten Sie das FastCGI-Modul und bearbeiten Sie 'Änderungen an Datei überwachen' und wählen Sie die Datei php.ini aus. Dadurch werden die untergeordneten Prozesse neu gestartet, sobald Sie eine Änderung speichern.

    
CAMason 22.10.2012 11:22
quelle
0

Sie können die Begrenzung auf -1 setzen, damit Sie nie Probleme mit der Größe der Dateien haben. Es ist wahrscheinlich nicht die beste Lösung, da Sie im Grunde sagen "wenn ich es nicht sehe, es existiert nicht", aber glauben Sie, es ist wirklich zuverlässig und wird immer funktionieren.

    
Emiliano Cervantes 03.01.2017 23:38
quelle