IPC mit PHP4 International PHP Conference 2002 06/11/2002, Frankfurt-Mörfelden Stephan Schmidt
Inhalt <ul><li>Was ist IPC? </li></ul><ul><li>Anwendungen in der PHP Welt </li></ul><ul><li>PHP ohne IPC </li></ul><ul><li...
Stephan Schmidt <ul><li>Web Application Developer bei der Metrix Internet Design GmbH in Karlsruhe </li></ul><ul><li>PHP s...
Was ist IPC? <ul><li>I nter- P rocess- C ommunication </li></ul><ul><li>Gleichzeitig laufende Prozesse kommunizieren mitei...
Anwendungen in der PHP Welt <ul><li>Webapplikationen   » Web-Chats   » Messenger </li></ul><ul><li>Desktop-Anwendungen   »...
PHP ohne IPC <ul><li>Standardfall von Webanwendung </li></ul><ul><li>Jeder Prozess läuft in einer „Sandbox“   » Jeder Proz...
Bisher keine Kommunikation? <ul><li>Kommunikation zwischen verschiedenen Prozessen findet fast in jeder Webanwendung statt...
Kommunikationsarten <ul><li>Zeitversetzte Kommunikation   » hohe Latenzzeit ( „ Briefverkehr”)   » Prozesse laufen nicht p...
Shared Memory <ul><li>Gemeinsam genutzte Speichersegmente </li></ul><ul><li>Lese- und Schreibzugriff möglich </li></ul><ul...
SHM Support in PHP <ul><li>Keine Unterstützung auf Windows Systemen </li></ul><ul><li>Extension seit PHP 3.0.6 verfügbar <...
Shared Memory Funktionen <ul><li>Anlegen eines neuen Segments oder Anbinden eines bestehenden Segments   » Indetifizierung...
Erzeugen bzw. Anbinden eines Segments <ul><li>$shmId = shm_attach( 2002, 1024 ); if( !$shmId )   die( &quot;Zugriff auf Se...
Schreiben von Werten <ul><li>define( &quot;Ort&quot;, 1 ); </li></ul><ul><li>shm_put_var( $shmId, Ort, &quot;PHP Conferenc...
Lesen von Werten <ul><li>$ort = shm_get_var( $shmId, Ort ); </li></ul><ul><li>Zwei Parameter: </li></ul><ul><li>Handle des...
Beenden der Anbindung <ul><li>shm_detach( $shmId ); </li></ul><ul><li>Handle des Shared Memory Segments als einzigen Param...
Konkurrierende Zugriffe <ul><li>Problem: Mehr als ein Prozess greift auf das Segment zu   » Korrupte Daten, falls ein Proz...
Semaphore in PHP <ul><li>Handle der Semaphore mit  sem_get()   » Erwartet eindeutige Kennung   » Gibt Handle zurück </li><...
Beispiel <ul><li>define( &quot;Ort&quot;, 1 ); </li></ul><ul><li>$shmKey  = 2002; </li></ul><ul><li>$semKey  = 2003; </li>...
patSHMC <ul><li>Kapselt shm_* und sem_* in einer Klasse </li></ul><ul><li>Instanziierung erzeugt Speichersegment </li></ul...
patSHMC Beispiel <ul><li>define( &quot;Ort&quot;, 1 ); </li></ul><ul><li>require_once(&quot;include/patSHMC.php&quot;); </...
Beispiel: Messenger <ul><li>Zeitnahe Kommunikation beliebig vieler Benutzer über Webbrowser </li></ul><ul><li>Nachrichten ...
Beispiel: Messenger
Beispiel: Messenger <ul><li>Userliste   » Array im Shared Memory Segment   » Array-Key = User ID   » Array-Wert = Nickname...
Daten im Speicher <ul><li>Array </li></ul><ul><li>( </li></ul><ul><li>[1] => schst </li></ul><ul><li>[2] => argh </li></ul...
Eingabeframe <ul><li>einfaches HTML Formular </li></ul><ul><li>Empfänger und Nachricht werden via POST an ein PHP Skript g...
Ausgabeframe <ul><li>set_time_limit()  verhindert Abbruch nach 30 Sekunden </li></ul><ul><li>register_shutdown_function() ...
Fallstricke <ul><li>set_time_limit() kann nicht ausgeführt werden </li></ul><ul><li>regelmäßig nicht sichtbare Daten schic...
Message Queues <ul><li>Verfügbar ab PHP 4.3 </li></ul><ul><li>Ermöglicht Senden von Nachrichten an einen anderen Prozess <...
Anlegen einer Queue <ul><li>$queue  = msg_get_queue( 2002 ); </li></ul><ul><li>Erwartet eindeutige Kennung der Queue </li>...
Senden einer Nachricht <ul><li>msg_send( $queue, 1, &quot;PHP Conference&quot; ); </li></ul><ul><li>Maximal 6 Parameter </...
Empfangen von Nachrichten <ul><li>$success  = msg_receive( $queue, 0, $msgType, 4096, $msg, true, MSG_IPC_NOWAIT, $error )...
Beispiel <ul><li>$queue  =  msg_get_queue( 2002 ); </li></ul><ul><li>msg_send( $queue, 1, &quot;PHP Conference&quot; ); </...
Informationen zu einer Queue <ul><li>stat_queue()  liefert Informationen zu einer Nachrichten Queue: </li></ul><ul><li>Arr...
Fazit <ul><li>IPC ist mit PHP leicht möglich </li></ul><ul><li>Nicht alles im Shared Memory speichern   » keine sensitiven...
Ende <ul><li>Viele Dank für Ihre Aufmerksamkeit. </li></ul><ul><li>Weitere Informationen: </li></ul><ul><li>http://www.php...
Upcoming SlideShare
Loading in …5
×

Interprozesskommunikation mit PHP

5,445
-1

Published on

Vortrag von der International PHP Conference 2002

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
5,445
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Interprozesskommunikation mit PHP

  1. 1. IPC mit PHP4 International PHP Conference 2002 06/11/2002, Frankfurt-Mörfelden Stephan Schmidt
  2. 2. Inhalt <ul><li>Was ist IPC? </li></ul><ul><li>Anwendungen in der PHP Welt </li></ul><ul><li>PHP ohne IPC </li></ul><ul><li>Kommunikationsarten </li></ul><ul><li>PHP mit IPC Support </li></ul><ul><li>Shared Memory mit PHP </li></ul><ul><li>Semaphore mit PHP </li></ul><ul><li>Beispielsapplikation </li></ul><ul><li>Fallstricke </li></ul><ul><li>Message Queues mit PHP </li></ul>
  3. 3. Stephan Schmidt <ul><li>Web Application Developer bei der Metrix Internet Design GmbH in Karlsruhe </li></ul><ul><li>PHP seit 1999 </li></ul><ul><li>Gründungsmitglied der PHP Application Tools www.php-tools.net </li></ul><ul><li>Autor von patTemplate, patXMLRenderer, patUser und anderen Open Source Klassen </li></ul><ul><li>Regelmäßiger Autor des PHP Magazins </li></ul>
  4. 4. Was ist IPC? <ul><li>I nter- P rocess- C ommunication </li></ul><ul><li>Gleichzeitig laufende Prozesse kommunizieren miteinander » Austausch beliebiger Daten </li></ul><ul><li>Verschiedene Kommunikationsmedien » Sockets » Shared Memory » Dateisystem </li></ul><ul><li>Verschiedene Protokolle, z.B. WDDX, serialize(),... </li></ul>
  5. 5. Anwendungen in der PHP Welt <ul><li>Webapplikationen » Web-Chats » Messenger </li></ul><ul><li>Desktop-Anwendungen » PHP-GTK </li></ul><ul><li>„ Remote Procedure Calls“ ohne „Remote“ » Ständig laufendes Skript führt Arbeiten aus und erhält Anweisungen von anderen Skripten. </li></ul>
  6. 6. PHP ohne IPC <ul><li>Standardfall von Webanwendung </li></ul><ul><li>Jeder Prozess läuft in einer „Sandbox“ » Jeder Prozess läuft für sich » PHP ist im Webserver gekapselt » Weiß nichts über andere Prozesse </li></ul><ul><li>Verhalten ist gewünscht » Sicherheit » Stabilität </li></ul><ul><li>PHP entwickelt sich weiter, IPC kann auch eine Rolle spielen. </li></ul>
  7. 7. Bisher keine Kommunikation? <ul><li>Kommunikation zwischen verschiedenen Prozessen findet fast in jeder Webanwendung statt: </li></ul><ul><li>Gästebuch, bzw. Forum » Eingabe von Daten, Ausgabe von Daten </li></ul><ul><li>Mehrseitige Formularabläufe » Weitergabe von Daten über Session </li></ul><ul><li>Unterschiede zu IPC? </li></ul><ul><li>» Art der Kommunikation </li></ul>
  8. 8. Kommunikationsarten <ul><li>Zeitversetzte Kommunikation » hohe Latenzzeit ( „ Briefverkehr”) » Prozesse laufen nicht parallel » Nachricht bleibt längere Zeit im Medium » Textdateien oder Datenbank als Medium </li></ul><ul><li>Zeitnahe (unmittelbare) Kommunikation » kurze Latenzzeit ( „Telefongespräch“) » Prozesse laufen gleichzeitig » Nachricht bleibt nur kurz im Medium » Schnelles Medium erforderlich </li></ul><ul><li>» Verwenden eines schnellen Mediums </li></ul>
  9. 9. Shared Memory <ul><li>Gemeinsam genutzte Speichersegmente </li></ul><ul><li>Lese- und Schreibzugriff möglich </li></ul><ul><li>Zugriff unabhängig von » Prozess » Skript / Applikation » Benutzer (kann eingeschränkt werden) » Programmiersprache </li></ul><ul><li>schneller Zugriff möglich </li></ul><ul><li>» Perfektes Medium für IPC </li></ul>
  10. 10. SHM Support in PHP <ul><li>Keine Unterstützung auf Windows Systemen </li></ul><ul><li>Extension seit PHP 3.0.6 verfügbar </li></ul><ul><li>Kompilieren mit --enable-sysvshm und --enable-sysvsem </li></ul><ul><li>System V Messages ab PHP 4.3 verfübgar, kompilieren mit --enable-sysvmsg </li></ul>
  11. 11. Shared Memory Funktionen <ul><li>Anlegen eines neuen Segments oder Anbinden eines bestehenden Segments » Indetifizierung durch eindeutige Kennung » Rückgabe eines Handles </li></ul><ul><li>Lesen und Schreiben von Werten unter Verwendung des Handles </li></ul><ul><li>Lösen der Anbindung </li></ul><ul><li>Bei Bedarf Löschen des Segments </li></ul>
  12. 12. Erzeugen bzw. Anbinden eines Segments <ul><li>$shmId = shm_attach( 2002, 1024 ); if( !$shmId ) die( &quot;Zugriff auf Segment nicht möglich.&quot; ); </li></ul><ul><li>Max. drei Parameter: </li></ul><ul><li>Eindeutige Kennung des Segments </li></ul><ul><li>Größe des Segments in Bytes, beschränkt durch Betriebssystem </li></ul><ul><li>Berechtigungsmaske analog zum Dateisystem </li></ul>
  13. 13. Schreiben von Werten <ul><li>define( &quot;Ort&quot;, 1 ); </li></ul><ul><li>shm_put_var( $shmId, Ort, &quot;PHP Conference 2002&quot; ); </li></ul><ul><li>Drei Parameter: </li></ul><ul><li>Handle, das von shm_attach() zurückgegeben wurde </li></ul><ul><li>Eindeutige Kennung der Variablen » Nur Integer Werte erlaubt » Verwendung von Konstanten </li></ul><ul><li>Wert der geschrieben werden soll </li></ul>
  14. 14. Lesen von Werten <ul><li>$ort = shm_get_var( $shmId, Ort ); </li></ul><ul><li>Zwei Parameter: </li></ul><ul><li>Handle des Shared Memory Segments </li></ul><ul><li>Eindeutige Kennung der Variablen </li></ul><ul><li>Löschen von Werten: </li></ul><ul><li>$ort = shm_remove_var( $shmId, Ort ); </li></ul>
  15. 15. Beenden der Anbindung <ul><li>shm_detach( $shmId ); </li></ul><ul><li>Handle des Shared Memory Segments als einzigen Parameter </li></ul><ul><li>Daten bleiben im Speicher erhalten </li></ul><ul><li>Löschen des Speichersegments </li></ul><ul><li>shm_remove( 2002 ); </li></ul><ul><li>Vorsicht: Kennung des Handles statt der Kennung übergeben! </li></ul>
  16. 16. Konkurrierende Zugriffe <ul><li>Problem: Mehr als ein Prozess greift auf das Segment zu » Korrupte Daten, falls ein Prozess schreibend zugreift (Daten werden während dem Lesen geändert) </li></ul><ul><li>Problemlösung: Lockingmechanismus (analog zu lock() ) » Nur ein Prozess greift auf Daten zu » Muss schnell sein (Testen und Setzen des Locks innerhalb eines Prozessortakts) </li></ul><ul><li>» Sempahore </li></ul>
  17. 17. Semaphore in PHP <ul><li>Handle der Semaphore mit sem_get() » Erwartet eindeutige Kennung » Gibt Handle zurück </li></ul><ul><li>Anfordern der Semaphore mit sem_aquire() » Erwartet Handle » Blockiert Ausführung bis Semaphore frei ist </li></ul><ul><li>Freigeben der Semaphore mit sem_release() » Erwartet Handle </li></ul><ul><li>Löschen der Semaphore mit sem_remove() » Erwartet Handle </li></ul>
  18. 18. Beispiel <ul><li>define( &quot;Ort&quot;, 1 ); </li></ul><ul><li>$shmKey = 2002; </li></ul><ul><li>$semKey = 2003; </li></ul><ul><li>$shmId = shm_attach( $shmKey, 1024 ); </li></ul><ul><li>$semId = sem_get( $semKey ); </li></ul><ul><li>sem_acquire( $semId ); </li></ul><ul><li>shm_put_var( $shmId, Ort, &quot;PHP Conference 2002&quot; ); </li></ul><ul><li>echo shm_get_var( $shmId, Ort ); </li></ul><ul><li>sem_release( $semId ); </li></ul><ul><li>shm_detach( $shmId ); </li></ul>
  19. 19. patSHMC <ul><li>Kapselt shm_* und sem_* in einer Klasse </li></ul><ul><li>Instanziierung erzeugt Speichersegment </li></ul><ul><li>Methoden zum » Lesen » Schreiben » Lock setzen </li></ul><ul><li>Download unter http://www.php-tools.net </li></ul>
  20. 20. patSHMC Beispiel <ul><li>define( &quot;Ort&quot;, 1 ); </li></ul><ul><li>require_once(&quot;include/patSHMC.php&quot;); </li></ul><ul><li>$shmKey = 2002; </li></ul><ul><li>$semKey = 2003; </li></ul><ul><li>$shm = new patSHMC( $shmKey, 50000, $semKey ); </li></ul><ul><li>$shm->lock( patEXCLUSIVE_LOCK ); </li></ul><ul><li>$shm->put_var( Ort, &quot;PHP Conference 2002&quot; ); </li></ul><ul><li>echo $shm->get_var( Ort ); </li></ul><ul><li>$shm->lock( patRELEASE_LOCK ); </li></ul><ul><li>$shm->detach(); </li></ul>
  21. 21. Beispiel: Messenger <ul><li>Zeitnahe Kommunikation beliebig vieler Benutzer über Webbrowser </li></ul><ul><li>Nachrichten haben genau einen Empfänger </li></ul><ul><li>Login nur mit Nickname » keine Authorisierung implementiert </li></ul><ul><li>Zwei Frames » Eingabe neuer Nachrichten » Ausgabe empfangener Nachrichten </li></ul>
  22. 22. Beispiel: Messenger
  23. 23. Beispiel: Messenger <ul><li>Userliste » Array im Shared Memory Segment » Array-Key = User ID » Array-Wert = Nickname </li></ul><ul><li>Nachrichten » Array im Shared Memory » Array-Key = User ID des Empfängers » Array-Wert = Array mit allen Nachrichten » Schicken von Nachrichten mit array_push() » Empfangen mit array_pop() </li></ul>
  24. 24. Daten im Speicher <ul><li>Array </li></ul><ul><li>( </li></ul><ul><li>[1] => schst </li></ul><ul><li>[2] => argh </li></ul><ul><li>) </li></ul><ul><li>Array </li></ul><ul><li>( </li></ul><ul><li>[1] => Array </li></ul><ul><li>( </li></ul><ul><li>) </li></ul><ul><li>[2] => Array </li></ul><ul><li>( </li></ul><ul><li>[0] => Array </li></ul><ul><li>( </li></ul><ul><li>[sender] => schst </li></ul><ul><li>[message] => Hallo! </li></ul><ul><li>) </li></ul><ul><li>) </li></ul><ul><li>) </li></ul>
  25. 25. Eingabeframe <ul><li>einfaches HTML Formular </li></ul><ul><li>Empfänger und Nachricht werden via POST an ein PHP Skript geschickt » Anbinden des Speichersegments » Lock setzen » Holen des Arrays mit allen Nachrichten » Anfügen der neuen Nachricht an das Array » Schreiben des Arrays in das Speichersegment » Lock freigeben » Anbindung lösen » Formular wieder ausgeben </li></ul>
  26. 26. Ausgabeframe <ul><li>set_time_limit() verhindert Abbruch nach 30 Sekunden </li></ul><ul><li>register_shutdown_function() falls Skript abbricht </li></ul><ul><li>Skript in Endlosschleife » Lock setzen » Array mit Nachrichten holen » Nachrichten für User aus Array löschen » Nachrichten ausgeben » flush(); » Lock freigeben » usleep( 500000 ); </li></ul>
  27. 27. Fallstricke <ul><li>set_time_limit() kann nicht ausgeführt werden </li></ul><ul><li>regelmäßig nicht sichtbare Daten schicken, um Timeout des Browsers zu verhindern </li></ul><ul><li>Ausgabepuffer mit flush() leeren und output_buffering in php.ini deaktivieren </li></ul><ul><li>Verbindungssteuerung mit connection_status() oder register_shutdown_function() nicht vergessen </li></ul>
  28. 28. Message Queues <ul><li>Verfügbar ab PHP 4.3 </li></ul><ul><li>Ermöglicht Senden von Nachrichten an einen anderen Prozess </li></ul><ul><li>Kein Locking mehr nötig </li></ul><ul><li>Nachrichten werden beim Lesen aus der Queue entfernt </li></ul>
  29. 29. Anlegen einer Queue <ul><li>$queue = msg_get_queue( 2002 ); </li></ul><ul><li>Erwartet eindeutige Kennung der Queue </li></ul><ul><li>Optional kann eine Berechtigungsmaske übergeben werden </li></ul><ul><li>Liefert Handle der Queue zurück </li></ul>
  30. 30. Senden einer Nachricht <ul><li>msg_send( $queue, 1, &quot;PHP Conference&quot; ); </li></ul><ul><li>Maximal 6 Parameter </li></ul><ul><li>Handle der Queue </li></ul><ul><li>Typ der Nachricht (Integer) » Empfänger ID beim Messenger </li></ul><ul><li>Inhalt der Nachricht </li></ul><ul><li>&quot;serialize&quot; Flag </li></ul><ul><li>&quot;blocking&quot; Flag (zu große Nachrichten) </li></ul><ul><li>Referenz zu Variable, in die ein eventueller Fehler gespeichert wird </li></ul>
  31. 31. Empfangen von Nachrichten <ul><li>$success = msg_receive( $queue, 0, $msgType, 4096, $msg, true, MSG_IPC_NOWAIT, $error ); </li></ul><ul><li>Parameter: </li></ul><ul><li>Handle der Queue </li></ul><ul><li>Typ der Nachricht, die gelesen werden soll </li></ul><ul><li>Referenz auf eine Variable, in die der Typ der gelesenen Nachricht geschrieben wird </li></ul><ul><li>maximale Länge der Nachricht </li></ul><ul><li>Referenz auf eine Variable, in die die Nachricht geschrieben wird </li></ul><ul><li>&quot;deserialize&quot; Flag </li></ul><ul><li>Flags, z.B. MSG_NOERROR, MSG_EXCEPT </li></ul><ul><li>Referenz auf eine Variable in die eine eventuelle Fehlermeldung geschrieben wird </li></ul>
  32. 32. Beispiel <ul><li>$queue = msg_get_queue( 2002 ); </li></ul><ul><li>msg_send( $queue, 1, &quot;PHP Conference&quot; ); </li></ul><ul><li>echo &quot;<pre>&quot;; </li></ul><ul><li>print_r( msg_stat_queue( $queue ) ); </li></ul><ul><li>echo &quot;</pre>&quot;; </li></ul><ul><li>$msg = &quot;&quot;; </li></ul><ul><li>$msgType = 0; </li></ul><ul><li>$error = 0; </li></ul><ul><li>$success = msg_receive( $queue, 1, $msgType, 4096, $msg, true, MSG_IPC_NOWAIT, $error ); </li></ul><ul><li>if( $success ) </li></ul><ul><li>echo $msg.&quot;<br />&quot;; </li></ul><ul><li>else </li></ul><ul><li>echo $error.&quot;<br />&quot;; </li></ul><ul><li>msg_remove_queue( $queue ); </li></ul>
  33. 33. Informationen zu einer Queue <ul><li>stat_queue() liefert Informationen zu einer Nachrichten Queue: </li></ul><ul><li>Array </li></ul><ul><li>( </li></ul><ul><li>[msg_perm.uid] => 33 </li></ul><ul><li>[msg_perm.gid] => 33 </li></ul><ul><li>[msg_perm.mode] => 438 </li></ul><ul><li>[msg_stime] => 1034647575 </li></ul><ul><li>[msg_rtime] => 1034524622 </li></ul><ul><li>[msg_ctime] => 1034523467 </li></ul><ul><li>[msg_qnum] => 1 </li></ul><ul><li>[msg_qbytes] => 16384 </li></ul><ul><li>[msg_lspid] => 9699 </li></ul><ul><li>[msg_lrpid] => 9301 </li></ul><ul><li>) </li></ul>
  34. 34. Fazit <ul><li>IPC ist mit PHP leicht möglich </li></ul><ul><li>Nicht alles im Shared Memory speichern » keine sensitiven Daten (Passwörter) » keine Daten, die länger gespeichert werden </li></ul><ul><li>shm_* und sem_* Funktionen sind nach Kapselung einfach zu bedienen </li></ul><ul><li>System V Messages sollten beim professionellen Einsatz auch gekapselt werden </li></ul>
  35. 35. Ende <ul><li>Viele Dank für Ihre Aufmerksamkeit. </li></ul><ul><li>Weitere Informationen: </li></ul><ul><li>http://www.php-tools.net </li></ul><ul><li>[email_address] </li></ul><ul><li>Dank an: </li></ul><ul><li>Sebastian Mordziol, Gerd Schaufelberger, Stephan Eisler, </li></ul><ul><li>Metrix Internet Design GmbH </li></ul>

×