Mailinglisten-Archive |
Till Gerken schrieb:
>
> > Nun weiß ich, das einige PHP-Chats shared-memory-funktionen nutzen, um
[...]
> Anmerkung: zu diesem Thema werde ich wahrscheinlich einen Vortrag auf dem
> PHP-Kongress halten, wenn also Interesse an der Beantwortung bestimmter
> Fragen im Zusammenhang mit Interprozeßkommunikation und Shared Memory
> bestehen, würde ich mich über eine Mail freuen.
GROSSES Interesse! (techn. Umsetzung in PHP, Voraussetzungen,
Fallstricke ...)
[...]
> phpChat arbeitet ebenfalls im Streamverfahren, wartet also im Inner-Loop nur
> darauf, daß die Flagvariable im Shared Memory für die eigene Session gesetzt
> wird.
Mist, hatte ich erwähnt, daß ich Psychologe mit Programmierkenntnissen
bin, und nicht Informatiker? :) Was meinst du mit Inner-Loop? Die
Endlosschleife, die die Datenbankabfragen zur Ausgabe macht?
> Das Submitfeld macht also nur folgendes: es nimmt die Nachricht entgegen,
> setzt das Flag im Shared Memory und schreibt den Nachrichtentext in die
> Datenbank. (der zusätzliche Weg über die Datenbank wird gewählt, damit der
> Einsatz von Shared Memory optional bleibt)
>
> Die Synchronisation der Lese- und Schreibzugriffe im Shared Memory wird über
> Semaphoren abgewickelt.
Äh, krieg ich dazu noch eine genauere Erklärung? Über die Semaphoren bin
ich ja auch schon im Manual gestolpert, aber eben nur gestolpert!
> Zum Resourcenverbrauch läßt sich folgendes sagen: bei Benutzung von Shared
> Memory sitzt phpChat praktisch 99% seiner Zeit im Idle-Loop. Dabei gibt
> phpChat die Kontrolle per sleep() zurück an das Betriebssystem, welches die
> Prozessorlast pro Apacheprozeß auf weniger als 0.1% auf einem Intel
> PentiumIII herunterschraubt.
Und wonach richtet sich die Länge des sleep()?
Und, erkaufe ich mir die Senkung der Prozessorlast nicht mit höherem
Speicherbedarf? Sowas um die 2,5 MB / Client?
Vielen Dank schon mal für deine Antwort, aber wenn mir jemand noch was
zur konkreten PHP-Umsetzung sagen könnte, oder auf ein Tutorial o.ä.
verweisen könnte, dann erspart mir das locker 2 Wochen intermittierender
Testerei über Trial & Error, einer unter Nicht-Informatikern sehr
beliebten Programmiertechnik.
Um zu zeigen, daß ich nicht einfach abschreiben will, ich denke mal, es
müßte in etwa so gehen:
$shm_key = shm_attach($key); // und wo kriege ich $key her?
// irgendwo gibt es eine Eingaberoutine
if($neue_nachricht != "") // jemand chattet
{
$chat_flag = 1;
shm_put_var($shm_key, $key_chat_flag, $chat_flag);
}
// und irgendwo schaut irgendwer nach Neuigkeiten
if(shm_get_var($shm_key, $key_chat_flag == 1) )
{
// löse MySQL-Abrage-Routine aus
}
// und wenn keiner mehr da ist:
shm_detach($shm_key); // trennen
shm_remove($shm_key); // speicher freigeben
Und wofür sind jetzt die Semaphoren?
Gespannte Grüße an alle
Andre
php::bar PHP Wiki - Listenarchive