select * from `xyz` WAIT FOR ENTRY o.Ä.

  • Thread starter Thread starter Deleted member 11691
  • Start date Start date
D

Deleted member 11691

Guest
Hallo,

folgendes Problem:

Derzeit benutze ich folgende Syntax um auf einen Datenbankeintrag zu warten:

PHP:
$query = "SELECT * FROM `tabelle` WHERE `id` > '".$curid."' LIMIT 0,1";
$query_ent = array();
while(!$entry_ent['id']) {
        $query_res = mysql_query($query);
        $query_ent = mysql_fetch_array($query_res);
}
// ...

Allerdings macht mir das bei mehreren hunderten Selects gleichzeitig die Performance in den ***. Gibt es für MySQL einen Befehl wie

Code:
SELECT * FROM `xyz` WHERE `id` > '".$curid."' LIMIT 0,1 WAIT_FOR_ENTRY

wo er dann so lange auf den Eintrag wartet, bis einer existiert?

Danke schonmal :)
 
Möglicherweise solltest du überlegen, ob es sinnvoller wäre, alle Einträge auszulesen und dann mittels php das array durchzugehen. Mir ist nicht klar, was das Ziel ist, aber das scheint mir eine Überlegung wert.

Statt * wäre auch zu überlegen explizit das aufzuzählen, was man an dieser Stelle tatsächlich benötigt.
 
Kannst Du den Hintergrund bzw. die eigentliche inhaltliche Aufgabe näher beschreiben? Mir geht es nämlich ähnlich Elradon, ich kann in dem Vorgehen keinen Sinn erkennen? Ich hab' so eine ungefähre Idee aber besser wär's Du führst Dein Problem näher aus. (Für mich klingt das, als ob Du nach einer Art Trigger suchst, der aber so glaube ich nicht funktionieren wird - sprich im Moment machst Du ein Polling Verfahren suchst aber nach einer Art Push Methode))
 
Last edited by a moderator:
(Für mich klingt das, als ob Du nach einer Art Trigger suchst, der aber so glaube ich nicht funktionieren wird - sprich im Moment machst Du ein Polling Verfahren suchst aber nach einer Art Push Methode)

Genau so ist es.

Ich möchte einen Chat für kleine Besprechungen nutzen, wo ich mir fertige Chats nicht erlauben darf.
 
Genau so ist es.

Ich möchte einen Chat für kleine Besprechungen nutzen, wo ich mir fertige Chats nicht erlauben darf.
Mir ist noch nicht ganz klar, für was Du das in diesem Bereich einsetzen willst. Bei einem Chat würde ich den Einsatz von mySQL eigentlich nur im Bereich Authentifizierung (+ zusätzliche Userdaten), Historie sowie Chatroom-Struktur sehen.

Die eigentliche Abwicklung des Echtzeit-Chats würde ich als Queue sehen, die von den Teilnehmern "befüllt" (Redebeiträge) und vom Server "geleert" (Veröffentlichen/Senden der Teilnehmerbeiträge an die verbundenen Clients sowie Einstellen in die Historie ggf.) wird. Diese Struktur würde ich eher im Arbeitsspeicher halten.
 
Und die Daten soll ich dann wie bei einem POST an den Server via PHP an alle PHP-Skripte global machen?
 
Naja, dann könnte ich ja gleich qwebirc mit IRC aufsetzen und das ganze so laufen lassen, was allerdings nicht sinn der Sache ist weil ich ja auch was dabei lernen möchte ;-)
 
Soweit ich Dich richtig verstanden habe, möchtest Du ja quasi, dass Dich mySQL über den Eintritt eines Ereignisses "informiert". Und das ist AFAIK nicht möglich.
 
Wieso lässt du das Server-Script auf den Datenbank-Eintrag warten? Angenommen es gibt keinen neuen Eintrag, dann läuft einfach die maximale Ausführungszeit ab und das Script fliegt auf die Nase.

(BTW zwingt dein Script den Server in die Knie. Es sollte immer eine Zeit gewartet werden vor dem nächsten Poll.)

Du solltest den Chat-Client (die Webseite) mit JavaScript bauen und dann per Ajax zyklisch (einmal alle X Sekunden) nachschauen, ob was neues da ist.
Das ist mit jQuery in recht wenig Zeilen zu machen. Der Server lässt den Query dann nur einmal laufen und liefert die neuen Nachrichten oder eben keine, wenn es keine gibt.

Wenn du keine Wartezeit bis zum nächsten Poll haben willst, brauchst du was, das Long-Polling unterstützt. Aber das kannst du mit PHP nicht sinnvoll umsetzen. Das wäre dann was für node.js.

Edit: Schau mal hier: http://css-tricks.com/jquery-php-chat/
 
Gibt es für MySQL einen Befehl wie

Code:
SELECT * FROM `xyz` WHERE `id` > '".$curid."' LIMIT 0,1 WAIT_FOR_ENTRY

wo er dann so lange auf den Eintrag wartet, bis einer existiert?
Trigger sind keine Lösung für das Problem des OP.

Genau das könnte man mit einem Trigger lösen.

Über die Sinnhaftigkeit von Chats mit DBMS-Backup lasse ich mich diesmal nicht aus, das wurde ja schon erwähnt.
 
Er will den SELECT erst ausführen lassen, wenn sich die Tabelle geändert hat und genau dafür gibt es Trigger.
Oder wie verstehst Du "WAIT_FOR_ENTRY"?
 
Er will den SELECT erst ausführen lassen, wenn sich die Tabelle geändert hat und genau dafür gibt es Trigger.
Oder wie verstehst Du "WAIT_FOR_ENTRY"?

[ ] Du hast verstanden, was DB-Trigger machen

Ich dachte schon ich hab die letzten zehn Jahre nicht aufgepasst...

Edit: Damit ich jetzt in dem Post auch was konstruktives stehen habe, möchte ich nochmal auf den von mir verlinkten Artikel mit jQuery/PHP für einen Chat verweisen. Das hat den Vorteil, dass es mit den beim OP bereits vorhandenen Technologien funktioniert und er auch was lernen kann, was zwar neu aber vermutlich nicht zu weit vom bisher bekannten liegt. Das Beispiel ist zwar mit plain file als Storage aber das lässt sich ja leicht durch die mySQL ersetzen.
 
Last edited by a moderator:
Das würde mich jetzt mal brennend interessieren, wie du mit einem Trigger das Problem des OP lösen willst. Vielleicht habe ich ja bisher was übersehen.
Mich auch, weil der TE ja ein Feedback über das Ereignis an sein PHP-Script braucht. Mir ist definitiv kein Weg bekannt, dass mySQL unabhängig an ein PHP-Script Daten zurückliefern kann. AFAIK ist PHP->mySQL-Query eine Einbahnstraße.
 
Back
Top