Mit Javascript per Ajax Daten an PHP senden, ohne rückmeldung
sf666
- javascript
Hi,
Ich bin noch etwas neu im Thema Ajax und PHP aber muss an einer bestehenden Webpage einige anpassungen machen oder erweiterungen machen.
Normalerweise schicken wird Daten Per Ajax an PHP, der schickt dann ein OK oder Fehlermeldung zurück. Ist auch gut so.
Jetzt habe ich aber einen Knopf mit dem möchte ich wieder Daten an PHP senden, aber ich möchte keine antwort erhalten. PHP soll einfach mit den geschickten Daten sein teil verrichten.
Soweit geht das auch, aber der Ajax-Request wartet nun ständig auf eine Antwort, da der PHP Script in einer sozusagen unendlicher schleife steckt, der aber nur abgebrochen wird, wenn der Knopf nochmal gedrückt wird und ein 2ter Ajaxaufruf geschickt wird, der die schleife beendet.
Wie kann ich dieses Problem beheben? Muss ich einfach den Request aborten?
MfG sf666
Hallo!
Jetzt habe ich aber einen Knopf mit dem möchte ich wieder Daten an PHP senden, aber ich möchte keine antwort erhalten. PHP soll einfach mit den geschickten Daten sein teil verrichten.
Du musst doch den response nicht verarbeiten oder, was ich empfehlen würde, nur im Fehlerfall.
Gruß Uwe
Danke für die Antworten,
Mag sein das ich mich noch unwissend anstelle mit dem Thema,bin noch Praktikant. Ich hab den Code mehr oder weniger übernommen und analysiert, auf dieser Basis und mit hilfe von Google versuch ich nun mein wissen zu erweitern.
Also erstens, der PHP Spript hört nach einem Timeout sowieso auf, sofern der Knopf nicht schon vorher nochmal gedrückt wurde, also unendlich läuft er dadurch natürlich nicht.
Es geht darum, das ich per PHP bei Map24 die Position eines realen Objekts(mit GPS ausgestattet) aufrufe, die ich von der Datenbank hole, und das tue ich innerhalb der schleife immerwieder für ca. 2min (oder bis ich den Knopf zum ausschalten nochmal drücke), also ich bzw. PHP aktualisiert alle 5sek die Map24 karte mit der neuen position.
Ich habe zudem mehrere Objekte in einer Tabelle aufgelistet, ich wähle eine aus, und sehe mir seine Position auf der Karte an (EINE Position, also ein Ajax aufruf).
Aber wenn ich das durch diese schlaufe automatisieren möchte (Realtime objektverfolgung), dann blockiert mir auf der website alles. Das heisst, wenn ich per Ajax wieder eine Position eines anderen Objekts anschauen möchte, dann muss ich warten, bis diese 2min. um sind vom letzen Objekt.
Ich möchte ja nicht 2min lang per Ajax 100 mal ein request schicken um PHP aufzufordern bei Map24 die Karte zu aktualisieren, das soll PHP selber im Hintergrund machen.
Wenn ich aber nach z.B. 30sekunden die Positionen der anderen Objekte anschauen möchte, muss ich diese schlaufe abbrechen.
Beim einschalten setzte ich eine static Variable auf true, wenn ich auschalte setzte ich die Variable auf false, anhand dieser Variable sollte er die schlaufe abrechen. Aber eben, ich kann ja die Variable im PHP nicht ändern, weil ich mit Ajax nichts mehr senden kann, bis diese 2min um sind.
Ich sehe mit Firebug wie der aufruf 2min lang etwas tut. Solange das ist, kann ich keine weiteren request abschicken.
Ich hoffe mein Problem ist etwas verständlicher.
Zum fehlerfall: response muss ich natürlich nicht verarbeiten, bei Fehlermeldungen wär das natürlich schön.
Aber bin vorerst froh wenn ich überhaupt einen 2ten request abschicken kann, bevor der PHP-script sein Timeout erreicht hat.
Hallo!
Also ich habe keine Ahnung worauf du hinaus willst? Du kannst doch beliebig viele Requests absetzen, die wissen doch nichts voneinander. Du musst natürlich jeweils ein eigenes XMLHttpRequest-Objekt benutzen.
Gruß Uwe
Tja, dann werd ich das wohl nicht hinkriegen, denn ich erzeuge bei jedem neuen aufruf ein neues Ajax.Request Objekt.
Dennoch, solange PHP in seiner schlaufe ist, reagieren die anderen requests nicht.
Trotzdem danke für eure Mühe. Probiers mal weiter.
Gruss sf666
Hi,
Tja, dann werd ich das wohl nicht hinkriegen, denn ich erzeuge bei jedem neuen aufruf ein neues Ajax.Request Objekt.
Dennoch, solange PHP in seiner schlaufe ist, reagieren die anderen requests nicht.
Wenn du eine Scriptinstanz hast, die "endlos" (zumindest sehr lange) laeuft - dann kann diese natuerlich, nachdem sie auf einen ersten Request hin gestartet wurde, nicht zwischendurch auf weitere Requests reagieren.
Weitere Requests wuerden hoechstens parallel weitere Scriptinstanzen starten.
Irgendwie klingt das ganze, was du da machst, immer noch ziemlich verquer ... wenn du mal genauer beschreibst, was da und wie ablaeuft, und welche Daten du zwischendurch per AJAX abfragen willst, dann findet sich vielleicht eine schoenere Loesung.
MfG ChrisB
Hallo sf666!
... denn ich erzeuge bei jedem neuen aufruf ein neues Ajax.Request Objekt.
Ich kenne kein "Ajax.Request Objekt". Benutzt du ein Framework?
Dennoch, solange PHP in seiner schlaufe ist, reagieren die anderen requests nicht.
Bau ein einfaches Modell, in dem das Problem auftritt und zeige uns den Quelltext. Die Schleife kann ja vielleicht durch eine einfache sleep-Anweisung simuliert werden.
Gruß Uwe
Hallo,
(Richtet sich nicht an dich persönlich, ist ganz allgemein gemeint:)
Ich kenne kein "Ajax.Request Objekt". Benutzt du ein Framework?
Man, Leute: Warum immer so stur? Hier kommen ständig Leute mit JavaScript-Fragen und nutzen offenbar Frameworks, ohne dass sie es immer ausdrücklich sagen. Meinem Gefühl nach sind es vor allem Prototype und jQuery, ab und zu Mootools oder größere bzw. speziellere. Weder muss man, noch kann man alle Frameworks kennen, um entsprechende Fragen zu beantworten. Aber trotzdem kann man sich die meisten »Ich kenne [Objekt] nicht, was ist das? Benutzt du ein Framework?« sparen. Gibt man das mal kurz bei Google ein, kommt z.B. sowas als erster oder zweiter Treffer heraus:
Prototype JavaScript framework: Ajax.Ajax.Request
www.prototypejs.org/api/ajax/request
Und diese Doku-Links beantworten meistens schon die Fragen der Threadstarter oder helfen zumindest weiter.
Mathias
Hallo Mathias!
Aber trotzdem kann man sich die meisten »Ich kenne [Objekt] nicht, was ist das? Benutzt du ein Framework?« sparen.
Klar kann man sich das sparen, wenn man will. Manchmal will ich und manchmal eben nicht ;-)
Mir persönlich geht diese Framework-Seuche tierisch auf den Geist und ich finde es gar nicht lustig, wenn ein Fragesteller die grundlegende Information, dass er mit einem Framework arbeitet, nicht liefert.
Weder muss man, noch kann man alle Frameworks kennen, um entsprechende Fragen zu beantworten.
Man muss aber entscheiden können, ob das Framework in das Problem involviert ist und dazu ist es äußerst hilfreich, wenn man weiß, dass überhaupt ein Framework mit im Spiel ist.
Gruß Uwe
Hi,
Mir persönlich geht diese Framework-Seuche tierisch auf den Geist und ich finde es gar nicht lustig, wenn ein Fragesteller die grundlegende Information, dass er mit einem Framework arbeitet, nicht liefert.
... und vielleicht selber gar nicht mal in dessen Doku geschaut hat.
... und vielleicht mit Frameworks herumspielt, obwohl grundlegende JavaScript-Kenntnisse noch fehlen.
(Auch das nur allgemein, und nicht auf diesen Thread bezogen.)
MfG ChrisB
Hallo,
... und vielleicht selber gar nicht mal in dessen Doku geschaut hat.
... und vielleicht mit Frameworks herumspielt, obwohl grundlegende JavaScript-Kenntnisse noch fehlen.
Das ist nunmal so: Es gibt Leute, die beschäftigen sich z.B. mit jQuery, ohne sich je mit JavaScript beschäftigt zu haben. Die haben dann über den jQuery-Tellerrand hinaus natürlich keinen Schimmer. Was auch der Sinn von manchen Frameworks ist, nämlich einfache JavaScript-Programmierung ohne JavaScript-Kenntnisse.
Es ist natürlich schwierig, solche Fragen hier zu beantworten, weil man mit fundierten JavaScript-Kenntnissen alleine nicht weiterkommt, wenn mit Frameworks operiert wird, die gleichsam eine neue Sprache erfinden.
Andererseits betreffen Fragen hier vielleicht 5% der Frameworks. Die werden gar nicht konsequent genutzt, sondern man verwendet z.B. gerade mal die Ajax-Funktionen.
Mathias
Hallo Matthias!
Was auch der Sinn von manchen Frameworks ist, nämlich einfache JavaScript-Programmierung ohne JavaScript-Kenntnisse.
Nein, das kann nicht Sinn eines Frameworks sein.
Damit wir uns nicht falsch verstehen, ich bin ganz und gar nicht gegen Frameworks. Wo, in welchem Bereich arbeitet man denn nicht mit Frameworks, Bibliotheken und wie immer man das nennen will. Ein gut duchdachtes, strukturiertes Framework ist Gold wert!
Aber ein Framework einzusetzen, ohne elementare Kenntnisse und elementares Verständnis der zugrundeliegenden Techniken, das ist einfach nur dilettantisch.
Gruß Uwe
Hallo Chris!
... und vielleicht selber gar nicht mal in dessen Doku geschaut hat.
... und vielleicht mit Frameworks herumspielt, obwohl grundlegende JavaScript-Kenntnisse noch fehlen.
Und vielleicht gar nicht mal weiß, dass ein Framework im Spiel ist. Alles schon dagewesen.
Gruß Uwe
Hallo,
wie ChrisB schon sagt, dein Problem liegt eher in deinem Konzept.
Ich nehme mal an, die Map24-Karte ist irgendeine Grafik oder ein Applet, jedenfalls soll es sich alle fünf Sekunden ändern, weil sich das dargestellte Objekt bewegt.
Gut, wie funktioniert dieses Map24? Wird eine Karte serverseitig generiert? Wie wird sie zum Client übertragen? Wird die Grafik immer neu geladen durch ein JavaScript? Was macht das PHP-Script genau?
Angenommen, es wird serverseitig eine Grafik oder so generiert, die auch zwischengespeichert werden kann: Für so eine regelmäßige Aufgabe sind PHP-Scripte, die du über eine HTTP-Anfrage über den Webserver anstößt, nicht geeignet. Für so etwas nutzt man richtige Serverprogramme, die dauerhaft im Hintergrund laufen und dann auch keine maximale Ausführungszeit haben.
Natürlich kannst du per PHP eine Programm auf dem Server starten und stoppen. Das Programm kann auch ein PHP-Script sein. Entscheidend ist, dass es selbst nicht an den Webserver/HTTP/CGI-Kontext gebunden ist. Dazu brauchst du natürlich entsprechende Rechte über den Server.
Ich weiß nicht, wie du die Aktualisierung auf dem Client vornimmst, also die geänderte Karte zum Client übertragen wird. Wenn auf dem Server ein Programm im Hintergrund läuft, das die Karte generiert, musst du auf dem Client natürlich alle paar Sekunden den Server kontaktieren und dir die eine neue Grafik abholen.
Wenn der Client nur Koordinaten braucht (ich stelle mir das wie Google Maps vor, wo man per JavaScript zu neuen Koordinaten springen kann), die direkt aus der Datenbank kommen, das Script daher nicht lange läuft und nichts großartig generieren muss, dann brauchst du kein Programm, das dauerhaft auf dem Server läuft. Dann kannst du auch gleich ein Script alle paar Sekunden per Ajax abfragen, das dir die Daten liefert.
Beschreibe am besten nochmal genauer, welche Aufgaben Client und Server erfüllen sollen.
Mathias
Hi,
Wie kann ich dieses Problem beheben? Muss ich einfach den Request aborten?
Wenn Du die Response nicht haben möchtest:
Dein Script muss trotzdem einen gültigen Header und wenigstens ein Zeichen ausgeben like:
print "Content-type: text/html\n\n";
print "OK";
sonst müllst Du Dir das error_log zu.
Ansonsten mach den Ajax-Request evntl. so ohne dass ein
req.onreadystatechange = ajaxResponse; // oder wie auch immer
erfolgt.
Hotte
Hallo,
Dein Script muss trotzdem einen gültigen Header und wenigstens ein Zeichen ausgeben
Nein, das macht PHP automatisch. Die Ausgabe erzeugt direkt den Körper der HTTP-Antwort. Header lassen sich nur über die Methode header() hinzufügen. Aber Content-Type: text/html wird standardmäßig gesendet, sofern man ihn nicht überschreibt.
Mathias
Hallo,
Dein Script muss trotzdem einen gültigen Header und wenigstens ein Zeichen ausgeben
Nein, das macht PHP automatisch. Die Ausgabe erzeugt direkt den Körper der HTTP-Antwort. Header lassen sich nur über die Methode header() hinzufügen. Aber Content-Type: text/html wird standardmäßig gesendet, sofern man ihn nicht überschreibt.
Tja, PHP ;-)
Btw., ich mach gerade viel mit Ajax und hab das hier mal aufgeschrieben zu:
(1) req.responseText
(2) req.responseXML
Danach richtet sich der Header der vorher kommen muss:
(1) "Content-type: text/html\n\n";
(2) "Content-type: text/xml\n\n";
Viele Grüße,
Hotte
Hallo,
(1) req.responseText
(2) req.responseXMLDanach richtet sich der Header der vorher kommen muss:
(1) "Content-type: text/html\n\n";
(2) "Content-type: text/xml\n\n";
Was willst du mir damit sagen? Es ist doch eher umgekehrt:
Wenn man HTML schicken will, schickt man HTML, der MIME-Typ ist text/html.
In responseText hat man dann Zugriff auf den HTML-Code. responseXML ist leer, weil HTML nunmal nicht XML ist.
Wenn man XML schicken will, schickt man XML, der MIME-Typ ist (sinnigerweise) application/xml.
In responseText hat man dann Zugriff auf den XML-Code. responseXML enthält den Wurzelknoten und darüber hat man Zugriff auf das DOM, das das XML-Dokument repräsentiert. (Vorausgesetzt, das XML-Dokument ist wohlgeformt und konnte fehlerfrei geparst werden.)
Man kann natürlich XHTML als application/xml schicken, wenn man DOM braucht.
Und sowieso kann man auch andere textbasierten Formate schicken und über responseText auslesen.
Was wolltest du noch gleich sagen? ;)
Mathias
Hallo,
Jetzt habe ich aber einen Knopf mit dem möchte ich wieder Daten an PHP senden, aber ich möchte keine antwort erhalten.
Ok. Wo ist das Problem?
PHP soll einfach mit den geschickten Daten sein teil verrichten.
Die Antwort musst du wie gesagt nicht mit onreadystatechange behandeln. Du sendest den XMLHttpRequest ab und nichts weiter. Wenn die Anfrage beim Server angekommen ist, wird das PHP-Script gestartet und läuft durch. Den Browser bzw. dein Script braucht die Antwort ja gar nicht zu interessieren.
Soweit geht das auch, aber der Ajax-Request wartet nun ständig auf eine Antwort, da der PHP Script in einer sozusagen unendlicher schleife steckt, der aber nur abgebrochen wird, wenn der Knopf nochmal gedrückt wird und ein 2ter Ajaxaufruf geschickt wird, der die schleife beendet.
Ich glaube, da wirfst du einiges durcheinander.
Ein Ajax-Request stößt ein PHP-Script an, das solange in einer Endlosschleife läuft, bis ein zweiter Ajax-Request ein weiteres (oder dasselbe) PHP-Script anstößt, welches dem ersten laufenden irgendwie mitteilt, dass dieses sich beenden kann?
Äh, bist du dir sicher? Wenn ja, wieso machst du das so? (Ich glaube eher, du missverstehst den Ablauf der Zusammenarbeit von client- und serverseitigen Scripten.) PHP hat standardmäßig eine Laufzeitbegrenzung für Scripte, sodass z.B. nach 30 Sekunden das Script ohnehin gewaltsam beendet wird.
Mathias