PHP readfile () endet nie und lässt Apache Server hängen

9

Ich habe ein großes Problem mit einem Apache-Server, PHP-App.

Der Server bedient eine Website mit ziemlich hohem Traffic, die mit PHP läuft.

Alle 24 Stunden oder 48 Stunden hängt der Apache, und ich muss ihn neu starten, um wieder auf die Webseite zugreifen zu können. Ich muss es neu starten, weil Apache die maximale Anzahl von erlaubten Prozessen / Servern (16000 für mich) erreicht, und es kann andere Prozesse nicht freigeben, weil andere Prozesse alle aktiv sind.

Die auf diesem Server gehostete Website ist eine php-App, die am Ende eine Datei bereitstellt: Nehmen wir an, es handelt sich um einen Download-Server.

Dateien werden vom Browser über ein Formular angefordert, das eine POST-Anfrage sendet.

Das Problem ist, dass diese Post-Anfrage niemals endet (ich kann sehen, dass fast alle 16000 Prozesse in meinem Server-Status POST-Anfragen sind).

Dateien, die bedient werden, sind große Dateien (10M bis 2G), und ich bediene sie mit php readfile Funktion (ich möchte sie nicht mit einem href Link liefern, also benutze ich eine Formular POST Anfrage, so dass der Benutzer nie sehen Sie, wo die Datei in meinem Dateisystem ist).

Die Funktion, die php readfile verwendet, scheint nie zu enden, auch wenn ich exit () am Ende davon benutze (siehe Code-Snipet unten).

Ich frage hier nach einer Möglichkeit, diese niemals endenden POST-Anfragen zu vermeiden, die durch meinen PHP-Code verursacht werden. Ich möchte den POST-Weg beibehalten, Dateien zu senden.

Zuerst mein conf:

  • Ubuntu-Server 14.04
  • Apache 2.4 mit mpm prefork
  • php 5.5.9 (mod php)
  • Hardware: 128G RAM

Meine mpm_prefork.conf-Datei:

%Vor%

meine apache2.conf-Datei:

%Vor%

Meine php.ini-Datei:

%Vor%

meine Apache-Protokolldateien: nichts Interessantes für mein Problem

Ein Munin-Diagramm, das anzeigt, wenn das Problem auftritt:

Mein Apache-Server-Status sieht so aus:

Und meine Serverklasse (der Code, der das Problem verursacht):

%Vor%

Hat jemand eine Lösung, um die nie endenden POST-Anfragen zu vermeiden? Ich bin in Ordnung, Dateien über andere Sache als PHP zu dienen, wenn es das Problem lösen kann.

Bitte nicht duplizieren, ich habe genug Code, Konf-Snippet und Bilder hinzugefügt, um diese Frage spezifisch zu machen:)

    
hedi 23.11.2015, 08:34
quelle

1 Antwort

3

mod_xsendfile ist eine gute Alternative zu PHP Dateien zu liefern.

Ссылка

Andernfalls können Sie Ihrem PHP-Skript einfach ein Timelimit hinzufügen, damit es nicht für immer ausgeführt werden kann.

Ссылка

    
user5542121 23.11.2015, 08:56
quelle

Tags und Links