[behoben] HTTP-push / Content-type aus PHP setzen?

Hallo,
ich suche eine PHP-Entsprechung zum initialen Setzen des Content-Types vor der eigentlichen Ausgabe bei Einleitung einer HTML-Push-Seite (Push bedeutet: Die Seite liefert dauernd Daten nach, wird quasi nie fertig, bekannt z.B. aus HTML-Chats)

Beispiel in Perl (Syntax ist PHP-tauglich, Verhalten mit „echo“ statt „print“ ist unter PHP identisch):


print "Content-type: multipart/x-mixed-replace;boundary=Seite

";
print "--Seite
";
print "Content-type: text/html

";
print "<html><body>
";

...

print "</BODY></HTML>
";
print "--Seite--
";

Probleme bei / Fragen zu PHP:

(1) Content-Type läßt sich so nicht wirksam setzen. Der String wird stattdessen als Text dargestellt. Wie macht man das dedizierte Setzen in PHP denn dann?

(2) „http_send_content_type()“ (gefunden im Manual bei php.net) liefert „Call to undefined function“. Ebenso alle „verwandten Befehle“.

  • muß ich da was zusätzliches installieren?
  • reicht die IPS-PHP-Version nicht aus? phpversion() auf dem IPS-Server sagt: 5.1.6
    (unter php.net sehe ich dazu nichts wegen evtl. Minimalanforderungen, außer eben PHP 5)

(3) „http_send_stream()“ klingt vielversprechend, bringt aber ebenso „Call to undefined function“. Wäre das aber der richtige Ansatz für HTML-Push? Oder wie macht man das üblicherweise unter PHP?

(4) Wäre das Simple-Web-Interface im IPS überhaupt Push-tauglich, oder geht das da prinzipiell sowieso nicht?
Z.B. habe ich bisher auch kein Flushen hinbekommen (=Daten werden sofort ohne Buffer ausgegeben)
Unter Perl:


$|=1;

Unter PHP lt. php.net und diversen Google-Treffern:


   @ob_flush();
   flush();

Trotz Zeitschleife im Script kommt der Output aber immer erst, wenn gesamte Abarbeitung fertig ist. Kann das das Simple-Web-Interface überhaupt, oder brauche ich allein dafür schon einen „großen“ Webserver auf dem IPS-Server?

Hat da netterweise vielleicht mal jemand einen Tipp, bevor ich da weiter sinnlos Zeit vergeude?

Gruß Gerd

PS …das ich da in die Laufzeitbegrenzung der IPS-Scripts laufe, ist mir klar. Wollte da aber mit Webbrowser-Objekt zugreifen aus Designer heraus, das wäre davon dann doch nicht betroffen.

Für den Content-Typ:versuche es mal mit der header()-Function .
Für die Push-Function: würde ich eine ajax-Funktion verwenden, die mit javascript-timer vom Browser regelmäßig aufgerufen wird.
Tommi

ja, klappt, danke :slight_smile:

nein, darum geht es mir nicht. Ich möchte einen permanent offenen Stream mit Echtzeit-Events haben, keine zyklische Abfragen. Ansonsten könnte ich ja gleich per IPS-Scheduler und WWW-Reader zyklisch abfragen.

[Edit]Ich habe inzwischen Beispiele in PHP zum HTML-Push gefunden, sehe aber, dass das IPS-Web-Interface offenbar mit den flush-Befehlen nicht zusammenarbeitet. Insofern ist der Push-Ansatz hier ohnehin nicht möglich und ich werde wohl nen großen Webserver wie z.B. den IIS nehmen müssen.

Dachte nur, vielleicht hätte da jemand doch noch eine Idee, bevor ich dem kleinen Server diese zusätzliche Last antue.[/Edit]

Gruß Gerd

Hallo Gerd,

wenn Du schon einen Webserver installierst, dann nutze den Apache, den gibts auch fuer Windows. Da haste dann wesentlich mehr PHP Unterstuetzung drin als bei IIS - da kannste dass dann nur per CGI Aufruf und damit nicht sehr performant aufrufen. Zumindest ist es mir so bekannt aus der Vergangenheit.

mag sein das der Apache das auch kann, aber ich bin beruflich IIS gewohnt. Und wir haben ja hier sowieso eine WIN-Umgebung und hätten dann auch gleich alle direkte Unterstützung bzgl. ASP, .NET, MSSQL Reporting Services usw…

Lieber wär mir natürlich, ich müßte das nicht. Wegen Server- und Updatelast usw. Eigentlich möchte ich ja nur Live auf sich ändernde Daten schauen. Aber eben eventgesteuert…

Ein alternativer und vielleicht noch besserer Ansatz wäre, „tail“ anzupassen, um je Zeile wget-like einen Zeile=Parameter übermittelnden Abruf an das Webinterface zu machen. Ist ja open source… Nur bin ich absolut nicht der C-Programmierer, noch dazu an nur auf W32 portierten Unix-Tools…

Gruß Gerd

Ein alternativer und vielleicht noch besserer Ansatz wäre, „tail“ anzupassen, um je Zeile wget-like einen Zeile=Parameter übermittelnden Abruf an das Webinterface zu machen. Ist ja open source… Nur bin ich absolut nicht der C-Programmierer, noch dazu an nur auf W32 portierten Unix-Tools…

Dann kann man gleich ein richtiges tail Modul für IPS in Delphi machen.
Es gibt aber auch PHP scripte dafür (mal nach „PHP tail“ suchen)

Tommi

ist bereits in Arbeit :wink:

Gruß,

Toni

Inspiriert durch diesen Thread hab ich das mal ausprobiert - und dabei festgestellt das IPS (wenn man den Header() Befehl nutzt) zwei mal den Content-Type sendet.

Mein Test Script:

<?php
header(‚Content-Type: text/bla‘);
?>

Beim Client kommt an:

HTTP/1.1 200 OK
Connection: close
Content-Type: text/html
X-Powered-By: PHP/5.1.6
Content-Type: text/bla
Server: Indy/10.0.52

Das bringt einige Browser ein wenig durcheinander.

Hat jmd. da einen Tipp, wie ich das abstelle? :confused:

Thx!

Die Sache mit den Headern ist etwas sensibel. Es darf vorher kein einziges Zeichen an den Client gehen, auch kein Leerzeichen. Das <? müssen die ersten Zeichen im Script sein, bei den includes ?> auch die letzten.
Dann kann man mit ob_start() den Puffer einschalten und vor der header()-Function mit ob_clean() die evtl. angefallenen Ausgaben wieder löschen. Ansonsten bringt PHP stehts den Standard-Header.Details stehen im php-Handbuch.

Tommi

Hm. So etwas in die Richtung hab ich schon probiert: Ich hab in der php.ini „output_buffering = On“ gesetzt und dann ob_clean() am Anfang des Scripts ausgeführt. Leider ohne Erfolg.

Ich glaub auch inzwischen, das man das mit IPS einfach (so) nicht machen kann. Wenn ich z.B. im Simple Web Interface ein Script hnterlege, das x.php heist und 0 Bytes lang ist, bekomme ich trotzdem zwei Content-Type’s im response:

Hypertext Transfer Protocol
HTTP/1.1 200 OK
Request Version: HTTP/1.1
Response Code: 200
Connection: close
Content-Type: text/html
X-Powered-By: PHP/5.1.6
Content-type: text/html
Server: Indy/10.0.52

Hallo,

selbstverstaendlich geht das mit dem Header, ich habe die Anzeige der Graphen im WIIPS auf diese Art geloest, damit keiner direkt auf die Grafikfiles zugreifen kann.

Anbei ein Bugfix.

Änderungen:
-Content-Type/Content-Length werden nur 1 mal im Header gesendet.
-Content-Type wird automatisch gesetzt anhand der Dateierweiterung. (.png -> image/png)

Die Flush Befehle werden in IPS nicht ausgewertet. Daran kann ich auch nichts ändern.

paresy

Device.WebInterface.rar (86.4 KB)

Super, vielen Dank! Jetzt ist alles gut.

Für die Suchfunktion:

Initial habe ich das Problem bemerkt als der Internet Explorer und Safari keine AJAX-(XML)-Responses verarbeitet haben.
Diese wurden erzeugt duch XAJAX oder AjaxAC. Im Firefox oder Opera gab es keine Probleme.

Jetzt läuft es mit allen (mehr oder weniger großen) Browsern. :slight_smile: