ob_flush
schreibt den Puffer. Mit anderen Worten, ob_flush
teilt PHP mit, Apache (oder nginx/lighttpd/was auch immer) die Ausgabe und dann für PHP zu geben, um es zu vergessen. Sobald Apache die Ausgabe hat, macht es damit, was es will. (Mit anderen Worten, nach ob_flush
liegt es außerhalb Ihrer Kontrolle, ob es sofort in den Browser geschrieben wird oder nicht).
Also, kurze Antwort: Es gibt keine garantierte Möglichkeit, das zu tun.
Nur eine Vermutung, Sie suchen wahrscheinlich AJAX. Wann immer Leute versuchen zu manipulieren, wenn der Seiteninhalt geladen wird, wie Sie es tun, ist AJAX fast immer der richtige Pfad.
Wenn Sie eine Aufgabe im Hintergrund fortsetzen möchten, können Sie ignore_user_abort
verwenden, wie detailliert here, aber das ist oft nicht der optimale Ansatz. Sie verlieren die Kontrolle über diesen Thread im Wesentlichen, und meiner Meinung nach ist ein Web-Server-Thread nicht dort, wo schwere Verarbeitung gehört.
Ich würde versuchen, es aus dem Web konfrontiert Sachen zu extrahieren. Dies könnte einen Cron-Eintrag bedeuten oder einfach einen Hintergrundprozess innerhalb von PHP erzeugen (ein Prozess, der innerhalb der Skriptausführung gestartet wird, wird jedoch nicht mit dem Skript beendet, und das Skript wartet nicht darauf, dass er beendet wird, bevor er stirbt).
Wenn Sie diese Route gehen, bedeutet dies, dass Sie bei Bedarf sogar ein Statussystem erstellen können. Dann könnten Sie die Ausführung überwachen und dem Benutzer regelmäßig über den Fortschritt informieren. (Technisch könnte man auch ein Statussystem mit einem ignore_user_abort
-ed-Skript erstellen, aber das scheint mir nicht so sauber.)
Nachdem Sie den ersten ob_flush durchgeführt haben, möchten Sie, dass andere Ausgaben angezeigt werden? Oder möchten Sie, dass die Anfrage vollständig abgeschlossen ist, so weit der Kunde dies erkennen kann, und dann im Hintergrund weiterarbeiten? – Corbin
weiter im Hintergrund – aWebDeveloper
Ok, habe meine Antwort aktualisiert. – Corbin