2009-08-13 3 views
1

Mein Skript besteht aus zwei Teilen. Der erste Teil generiert HTML-Seite. Der zweite Teil lädt eine Ressource aus dem Netz und speichert sie in einer Datei. Das Laden ist ein langer Vorgang und kann bis zu 10 Sekunden dauern. Der erste und der zweite Teil sind völlig unabhängig (das Laden hat keinen Einfluss auf das Aussehen der Seite).PHP: Wie Seite anzeigen, bevor das Skript beendet ist?

Am Ende des ersten Teils rufe ich flush(), das macht die Seite sofort angezeigt.

Der eingebettete SWF-Film wird jedoch in diesem Moment nicht angezeigt.

SWF ist das Schlüsselelement der Seite und muss so schnell wie möglich angezeigt werden. Es ist in die Seite mit SwfObject-Bibliothek eingebettet. Und das Problem ist, dass SwfObject beginnt, SWF auf "onLoad" -Ereignis der Seite zu öffnen.

Aber "onLoad" Ereignis kommt am Ende des zweiten Teils. Das ist "onLoad" kann in 10 Sekunden auftreten. Also trotz flush() call muss der User 10 Sekunden vergeblich warten.

Ist es möglich, die Aufgabe auf der PHP-Seite zu lösen? Ist es möglich, "loading" Task (der zweite Teil) in einem separaten Prozess auszuführen? Ist es möglich, dem Browser zu sagen, bevor der zweite Teil gestartet wird, dass die Seite erneut angezeigt wird und Sie das "onLoad" -Ereignis übertragen können.

Danke für das Lesen dieser sehr langen Geschichte.

Antwort

2

Ich schlage vor, Sie den Code in zwei separate PHP-Dateien aufteilen:

Die erste Datei erzeugt die HTML-Seite die SWF enthält.

Die zweite Datei ruft die Ressource ab und speichert sie.

Der Trick ist, dass Sie im OnLoad-Ereignis der ersten Seite ein kleines JavaScript-Snippet ausführen, das die URL der zweiten Seite anfordert.

Der Code auf der ersten Seite würde wie folgt aussehen:

... 
<body onload="makeRequest('page2.php')"> 
... 

wo macherequest eine Funktion etwas wie das hier ist: http://www.captain.at/howto-ajax-form-post-get.php

Diese AJAX Tutorial machen für das Verständnis, dass hilfreich sein.

Natürlich, wenn diese Dinge wirklich unabhängig sind, sollten Sie den zweiten in einem separaten Prozess oder Thread ausführen. pcntl-fork kann hier helfen.

+0

Was ist, wenn JS deaktiviert ist? – Wookai

+0

Dann schlage ich definitiv vor, den zweiten Teil in einem getrennten Prozess entweder mit pcntl-Fork oder System auszuführen. –

2

PHP unterstützt Threading nicht, also müssten Sie ein Skript schreiben, das den zweiten Teil ausführt und es mit der Methode exec() ausführt. Aber das ist wahrscheinlich auch nicht die beste Lösung.

Was Sie wahrscheinlich tun können, ist vergessen, verschieben Sie den zweiten Teil, der lange Zeit benötigt, um Skript oder Controller-Aktion zu trennen, wenn Sie MVC-Controller verwenden. Dann starte einfach den ersten Teil und deine Seite wird schnell geladen. Dann können Sie ein AJAX hinzufügen, um das neue Skript/die neue Aktion aufzurufen, um den zweiten Teil Ihres Algorithmus nach dem Laden Ihrer Seite auszuführen.

+1

+1 für MVC: nur einen Aktionsaufruf mit AJAX nach dem Laden der SWF auslösen – markus

+0

Danke, ich werde diesen Ansatz versuchen. – Pavel

1

Anstatt "onload" können Sie am Ende der Seite einen Skriptblock hinzufügen, um Ihren SWF-Film zu initialisieren.

+0

SWFObject bietet keine API-Methode, um dies legal zu machen. Ich würde es vorziehen, diese lib zu hacken. – Pavel

1

Ich bin mir nicht sicher, aber was ist, wenn Sie diesen SWF-Film in einen IFRAME einfügen?

+0

Leider ist dies nicht mein Fall – Pavel

0

Ein Ansatz besteht darin, die zweite Stufe über eine unidirektionale Webserviceanforderung von der ersten Stufe aus zu initiieren. Angenommen, Sie verwenden PHP 5, schauen Sie sich die SOAP-Unterstützung an.

Wenn der Client nicht geladen wird, nachdem Sie flush() aufgerufen haben, gibt es zwei Möglichkeiten: Erstens kann der Webserver die Ausgabe puffern und nicht zum Client gelangen. Zweitens haben Sie beim Aufruf von flush() keine vollständige Seite erzeugt. Das letztere Problem sollte leicht zu lösen sein.

+0

Die Seite wird nach flush() vollständig angezeigt, aber "onload" -Ereignis wird nicht ausgelöst. Danke für die SOAP-Idee. – Pavel

+0

Browser zeigen Inhalte an, sobald sie empfangen werden, rufen das Ereignis onLoad jedoch erst auf, wenn das schließende HTML-Tag empfangen wurde. Verwenden Sie ein Überwachungstool wie Firebug oder Fiddler, um zu überprüfen, dass Sie tatsächlich die vollständige Seite senden. – kdgregory

Verwandte Themen