Ajax und Zusammenspiel Apache, PHP & MySQL

deostift

Erfahrenes Mitglied
Ich grüße Euch und bitte Euch um Rat :)

Also, mal angenommen ich habe ein PHP Skript welches in einer MySQL Tabelle eine Summenberechnung durchführt und unter Umständen Millionen an Eintragen durchackern darf - sprich es läuft seine Zeit. Hinweiß: Die MySQL Connection baue ich mit einem singleton Pattern auf - sprich nur eine Connection.

Wenn ich nun diese Anfrage mittels AJAX absetze, habe ich dann eine Möglichkeit diese Summenbildung während der Laufzeit abzubrechen? Von JavaScript wird ja ein Request an den Apache losgetreten, der einen (PHP) Fork für diese Anfrage erstellt und einen MySQL SELECT abfeuert der unter Umständen bei einem zu großen Zeitbereich einuge Sekunden laufen kann.

Ich weiß, dass man die AJAX Anfrage "aborten" kann. Dies gilt aber vermutlich nur für den Browser-Client, der auf keinen Response mehr wartet? Korrekt? Das PHP Skript und die MySQL Anfrage laufen ja weiterhin auf dem Server und erzeugen einiges an Last. Auch richtig?

Um die Frage von oben nochmals aufzugreifen: Kann ich einen, sagen wir, "Panik-Button" implementieren, den der Kunde klickt, wenn er nachträglich merkt dass die DB Abfrage minutenlang laufen würde, und der die MySQL Anfrage killt und somit auch das PHP Skript das mittels Ajax angestoßen wurde stoppt?

Ich hoffe Ihr versteht mein Problem. Ansonsten würden mich noch Hinweise / Literatur interessieren, die konkret das Zusammenspiel von Apache, PHP und MySQL aufzeigen. WErden z.B. bei 5 gleichzeitig losgetretenen AJAX Anfragen mittels PHP an die DB auch 5 MySQL Prozesse angestoßen oder werden die durch die Session gesammelt und nacheinander abgeschickt?



Ich Danke Euch :)
 
Zuletzt bearbeitet:
Moin,

gute Frage :-)

Ich hab das mal getestet.
Du kannst da auf nichts vetrauen.
Egal ob du abort() verwendest, die Seite neu lädtst oder gar den Browser schliesst, die Sache läuft noch weiter, wenn auch nicht unbedingt immer bis zum Ende.
Ein probates serverseitiges Mittel, herauszufinden, ob die Verbindung geschlossen wurde, gibt es auch nicht(connection_aborted() ist da nutzlos).

Was mir einfiele:
zum Abbruch einen weiteren Request senden, der serverseitig irgendeine Art Flag speichert, die darauf hinweist, dass die Sache beendet werden kann. Diese Flag dann halt irgendwie auslesen in Intervallen.

Ob das in deinem Fall geht, hängt natürlich davon ab, ob du da irgendwo einen Punkt einfügen kannst, wo diese Flag regelmässig geprüft werden kann.
 
Es gibt die Möglichkeit per show processlist in mysql die aktuelle Prozessliste abzufragen. Man erhält dann z.B sowas hier
Code:
| 25 | user | server | mysql | Query   |    4 | Sending data | Select  SQL_CALC_FOUND_ROWS a .  * , b .  * , c .  *  from help_category as a, help_relation as b, h |

Diesen Prozess kann man dann mit Hilfe der ID ganz einfach abwürgen:
Code:
kill 25;

Das schwierigste daran dürfte wohl sein herauszufinden welcher Prozess jetzt von welchem Axax-call gestartet wurde um nicht irgendwem anders den Prozess zu killen.
 
Das schwierigste daran dürfte wohl sein herauszufinden welcher Prozess jetzt von welchem Axax-call gestartet wurde um nicht irgendwem anders den Prozess zu killen.

Ich kenn mich mit dem Zusammenspiel auch nicht sehr aus, aber was mit spontan zu dem obigen Problem einfallen würde:
Der Reqeust bekommt eine UUID, die auf dem Client generiert wird. Diese wird mit in das SQL statement eingebaut:
Code:
SELECT 'UUID', * from table
Dann taucht die UUID bei dem show processlist wieder auf und du kannst anhand ihrer den richtigen Prozess filtern und killen...
 
Danke für die Hinweise! Habe mir auch schon überlegt die Thread ID der Ajax Connection vorher z.B. in der Session zu speichern und über einen weiteren Ajax Request diese dann zu killen.

Problem was ich nun gerade noch habe. Wenn ich 3 Ajax Requests gleichzeitig lostrete, sehe ich in der Process list (via phpmyadmin) immer nur einen SELECT und nicht 3 Prozesse. In der "top" Lste des Linux Servers sehe ich aber auch keine neuen httpd2-prefork Prozesse. Vermutlich serialisiert der Apache die Anfragen, wäre auch eine Erklärung weshalb nicht 3 DB Prozesse gleichzeitig laufen.. *seufz*

Kennt jemand eine gute Literatur, die einem das Server-Hintergrundwissen beibringt? Also nicht wie man die Module installiert sondern eben z.B. ob der Apache Anfragen serialisiert oder nicht etc.
 
Zurück