Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Démons en PHP
  de inetd à ZeroMQ
Démons en PHP

Introduction
Démons basés sur (x)inetd
Démons multi-processus
Démons mono-processus
ZeroMQ
Introduction
« Démon » ?

          Nom masculin
          Barbarisme (daemon)
            « Disk And Execution MONitor »

    Programm...
Quelques exemples

        Démons réseau        Démons applicatifs

           Apache (httpd)    Crontab (crond)

  Impres...
Mais pourtant...


   Le démon d'une application web,
   c'est Apache / Lighttpd / Nginx !




       C'est de moins en mo...
Navigateur
                     Démon
      web            HTTP



   Démon
                     Application
traitement
  ...
Navigateur
                         Démon
    web                  HTTP




                         Application
         ...
Navigateur
                        Démon
   web                  HTTP




                        Serveur
                ...
Démons en PHP

          Avantages      Inconvénients

Développement rapide     Connaissances requises

Bonnes performance...
Benchmark

   ATOM N270 1.6 GHz − RAM 1 GO

   Connexion unique
        Temps de connexion
        Envoi et réception (2 m...
Exemple : myecho
                                               Code C
#include   <stdio.h>                               ...
Exemple : myecho

                      Exécution

# telnet localhost 11142
Trying 127.0.0.1...
Connected to localhost.
Es...
Benchmark : connexion unique

   Type    Connexion   Échange 1   Échange 2

    C        5 µs        3 µs        2 µs
Benchmark : connexions multiples

          100         100        1000         1000
Type                                 ...
Démons basés
 sur (x)inetd
(x)inetd : super-démon


Écoute plusieurs ports

Instancie un programme à
chaque connexion entrante

Transmission sur les ...
Exemple : myecho

                 Code PHP

#!/usr/bin/php
<?php

while (!feof(STDIN)) {
    $s = fgets(STDIN);
    print...
Exemple : myecho

            Configuration xinetd

service myecho
{
   type          =   UNLISTED
   user          =   ro...
(x)inetd

           Avantages      Inconvénients

Développement rapide      Consommation mémoire

  Aucune dépendance    ...
Benchmark : connexion unique

   Type     Connexion   Échange 1   Échange 2

     C        5 µs        3 µs        2 µs

 ...
Benchmark : connexions multiples

            100         100        1000         1000
Type                               ...
Démons
multi-processus
Principe


Simple : inetd internalisé

Un processus attend les connexions

Création d'un nouveau sous-processus
à chaque c...
Exemple : myecho
                     Code PHP
#!/usr/bin/php
<?php

daemonize();
$socket = stream_socket_server('tcp://0....
Exemple : myecho
                   Code PHP
function daemonize() {
    pcntl_signal(SIGCHLD, SIG_IGN);
    if (pcntl_fork...
Multi-processus

           Avantages      Inconvénients

       Latence réduite    Consommation mémoire

  Aucune dépenda...
Benchmark : connexion unique

   Type     Connexion   Échange 1   Échange 2

     C        5 µs        3 µs        2 µs

 ...
Benchmark : connexions multiples

            100         100        1000         1000
Type                               ...
Démons
mono-processus
Principe


Un seul processus

> attend les nouvelles connexions

> répond aux requêtes
Mono versus multi-processus

                Multi    Mono

           I/O lentes    I/O rapides

        Code simple     ...
Exemple : myecho
                             Code PHP
#!/usr/bin/php
<?php

daemonize();
$socket = stream_socket_server('...
Exemple : myecho
                 Code PHP

function closeSocket($sock, &$allSockets) {
    fclose($sock);
    $key = arra...
Mono-processus

         Avantages      Inconvénients

Ressources préservées   Délai exponentiel

  Aucune dépendance     ...
Benchmark : connexion unique

   Type     Connexion   Échange 1   Échange 2

     C        5 µs        3 µs        2 µs

 ...
Benchmark : connexions multiples

            100         100        1000         1000
Type                               ...
ZeroMQ
Présentation

Bibliothèque de fonctions réseau

Gestion de files de messages

Protocole spécifique

37 langages supportés
...
Méthodes de transport



Inter-threads     inproc

Inter-processus   ipc

Inter-machines    tcp
Découplage du sens de connexion




  Client             Serveur
Découplage du sens de connexion




  Client             Serveur
Socket multi-connexion


Client


               port A
Client                  Serveur



Client
               port B
Polling

                 Socket ZMQ

    Socket TCP                Socket ZMQ


Socket TCP                        STDIN

...
Connexion REQ/REP




           REQ
Client                 Serveur
Connexion REQ/REP




                  REP
Client                  Serveur
Connexion PUSH/PULL




         PUSH
Client             Serveur
Connexion PUSH/PULL




             PULL
Client              Serveur
Connexion PUB/SUB


                Client


          PUB
Serveur         Client



                Client
Connexion PUB/SUB

            SUB
                  Client


            SUB
Serveur           Client


            SUB
 ...
Load-balancing

                 PULL
                        Client


          PUSH
Serveur                 Client



  ...
Load-balancing


                        Client


          PUSH   PULL
Serveur                 Client



                ...
Load-balancing


                        Client


          PUSH
Serveur                 Client


                 PULL
  ...
Pipeline


Client              Worker



Client              Worker



Client              Worker
ZeroMQ : Installation

            Linux Ubuntu 11.10

# apt-get install libzmq-dev

# apt-get install php-pear

# pear ch...
Exemple : myecho

                 Code PHP : serveur ZMQ

#!/usr/bin/php
<?php

$ctx = new ZMQContext();
$server = new ZM...
Exemple : myecho

                 Code PHP : client ZMQ

#!/usr/bin/php
<?php

$ctx = new ZMQContext();
$client = new ZMQ...
Benchmark : connexion unique

   Type     Connexion   Échange 1   Échange 2

     C        5 µs        3 µs        2 µs

 ...
Benchmark : connexions multiples

            100         100        1000         1000
Type                               ...
Conclusion
Démons en PHP


Faciles et rapides à coder

Vraiment performant

(x)inetd, mono/multi-processus,
ZeroMQ, libevent, eio, ...
geek-directeur-technique.com/zeromq




         amaury@amaury.net
Démons en PHP, de inetd à ZeroMQ
Upcoming SlideShare
Loading in …5
×

of

Démons en PHP, de inetd à ZeroMQ Slide 1 Démons en PHP, de inetd à ZeroMQ Slide 2 Démons en PHP, de inetd à ZeroMQ Slide 3 Démons en PHP, de inetd à ZeroMQ Slide 4 Démons en PHP, de inetd à ZeroMQ Slide 5 Démons en PHP, de inetd à ZeroMQ Slide 6 Démons en PHP, de inetd à ZeroMQ Slide 7 Démons en PHP, de inetd à ZeroMQ Slide 8 Démons en PHP, de inetd à ZeroMQ Slide 9 Démons en PHP, de inetd à ZeroMQ Slide 10 Démons en PHP, de inetd à ZeroMQ Slide 11 Démons en PHP, de inetd à ZeroMQ Slide 12 Démons en PHP, de inetd à ZeroMQ Slide 13 Démons en PHP, de inetd à ZeroMQ Slide 14 Démons en PHP, de inetd à ZeroMQ Slide 15 Démons en PHP, de inetd à ZeroMQ Slide 16 Démons en PHP, de inetd à ZeroMQ Slide 17 Démons en PHP, de inetd à ZeroMQ Slide 18 Démons en PHP, de inetd à ZeroMQ Slide 19 Démons en PHP, de inetd à ZeroMQ Slide 20 Démons en PHP, de inetd à ZeroMQ Slide 21 Démons en PHP, de inetd à ZeroMQ Slide 22 Démons en PHP, de inetd à ZeroMQ Slide 23 Démons en PHP, de inetd à ZeroMQ Slide 24 Démons en PHP, de inetd à ZeroMQ Slide 25 Démons en PHP, de inetd à ZeroMQ Slide 26 Démons en PHP, de inetd à ZeroMQ Slide 27 Démons en PHP, de inetd à ZeroMQ Slide 28 Démons en PHP, de inetd à ZeroMQ Slide 29 Démons en PHP, de inetd à ZeroMQ Slide 30 Démons en PHP, de inetd à ZeroMQ Slide 31 Démons en PHP, de inetd à ZeroMQ Slide 32 Démons en PHP, de inetd à ZeroMQ Slide 33 Démons en PHP, de inetd à ZeroMQ Slide 34 Démons en PHP, de inetd à ZeroMQ Slide 35 Démons en PHP, de inetd à ZeroMQ Slide 36 Démons en PHP, de inetd à ZeroMQ Slide 37 Démons en PHP, de inetd à ZeroMQ Slide 38 Démons en PHP, de inetd à ZeroMQ Slide 39 Démons en PHP, de inetd à ZeroMQ Slide 40 Démons en PHP, de inetd à ZeroMQ Slide 41 Démons en PHP, de inetd à ZeroMQ Slide 42 Démons en PHP, de inetd à ZeroMQ Slide 43 Démons en PHP, de inetd à ZeroMQ Slide 44 Démons en PHP, de inetd à ZeroMQ Slide 45 Démons en PHP, de inetd à ZeroMQ Slide 46 Démons en PHP, de inetd à ZeroMQ Slide 47 Démons en PHP, de inetd à ZeroMQ Slide 48 Démons en PHP, de inetd à ZeroMQ Slide 49 Démons en PHP, de inetd à ZeroMQ Slide 50 Démons en PHP, de inetd à ZeroMQ Slide 51 Démons en PHP, de inetd à ZeroMQ Slide 52 Démons en PHP, de inetd à ZeroMQ Slide 53 Démons en PHP, de inetd à ZeroMQ Slide 54 Démons en PHP, de inetd à ZeroMQ Slide 55 Démons en PHP, de inetd à ZeroMQ Slide 56 Démons en PHP, de inetd à ZeroMQ Slide 57 Démons en PHP, de inetd à ZeroMQ Slide 58 Démons en PHP, de inetd à ZeroMQ Slide 59 Démons en PHP, de inetd à ZeroMQ Slide 60 Démons en PHP, de inetd à ZeroMQ Slide 61 Démons en PHP, de inetd à ZeroMQ Slide 62 Démons en PHP, de inetd à ZeroMQ Slide 63
Upcoming SlideShare
Présentation GTD
Next
Download to read offline and view in fullscreen.

6 Likes

Share

Download to read offline

Démons en PHP, de inetd à ZeroMQ

Download to read offline

Version simplifiée de la conférence «Démons en PHP, de inetd à ZeroMQ», présentée pour la première fois le 6 juin 2012 au Forum PHP.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Démons en PHP, de inetd à ZeroMQ

  1. 1. Démons en PHP de inetd à ZeroMQ
  2. 2. Démons en PHP Introduction Démons basés sur (x)inetd Démons multi-processus Démons mono-processus ZeroMQ
  3. 3. Introduction
  4. 4. « Démon » ? Nom masculin Barbarisme (daemon) « Disk And Execution MONitor » Programme indépendant Tourne en tâche de fond Serveur logiciel Accepte des connexions entrantes
  5. 5. Quelques exemples Démons réseau Démons applicatifs Apache (httpd) Crontab (crond) Impression (lpd / cupsd) Périphériques (devfsd) Connexion distante (sshd) X server
  6. 6. Mais pourtant... Le démon d'une application web, c'est Apache / Lighttpd / Nginx ! C'est de moins en moins vrai
  7. 7. Navigateur Démon web HTTP Démon Application traitement PHP images Stockage Traitement images
  8. 8. Navigateur Démon web HTTP Application PHP images vidéos sms File de messages
  9. 9. Navigateur Démon web HTTP Serveur de jeu Serveur websocket Univers de jeu
  10. 10. Démons en PHP Avantages Inconvénients Développement rapide Connaissances requises Bonnes performances Consommation mémoire Réutilisation de code
  11. 11. Benchmark ATOM N270 1.6 GHz − RAM 1 GO Connexion unique Temps de connexion Envoi et réception (2 messages) Connexions multiples 100 / 1000 connexions Temps de connexion Envoi et réception (1 message) Implémentation de référence en C
  12. 12. Exemple : myecho Code C #include <stdio.h> signal(SIGCHLD, SIG_IGN); #include <stdlib.h> bind(sock, (struct sockaddr*)&addr, #include <strings.h> sizeof(addr)); #include <sys/types.h> listen(sock, 5000); #include <sys/socket.h> #include <unistd.h> addr_sz = sizeof(client_addr); #include <netinet/in.h> while (1) #include <signal.h> { client_sock = accept(sock, (struct int main(void) sockaddr*)&client_addr, { &addr_sz); int sock; if (fork() == 0) int client_sock; { struct sockaddr_in addr; close(sock); struct sockaddr_in client_addr; while ((sz = read(client_sock, buffer, socklen_t addr_sz; 512)) > 0) size_t sz; { int offset = 0; write(client_sock, buffer, sz); char buffer[512]; } close(client_sock); bzero(&addr, sizeof(addr)); exit(0); addr.sin_port = htons(11142); } addr.sin_family = AF_INET; } addr.sin_addr.s_addr = htonl(INADDR_ANY); close(sock); return (0); sock = socket(AF_INET, SOCK_STREAM, 0); }
  13. 13. Exemple : myecho Exécution # telnet localhost 11142 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello Hello Test 1 Test 1 Test 2 Test 2
  14. 14. Benchmark : connexion unique Type Connexion Échange 1 Échange 2 C 5 µs 3 µs 2 µs
  15. 15. Benchmark : connexions multiples 100 100 1000 1000 Type Maximum connexions messages connexions messages C 0.04 s 0.05 s 6.5 s 0.2 s > 1000
  16. 16. Démons basés sur (x)inetd
  17. 17. (x)inetd : super-démon Écoute plusieurs ports Instancie un programme à chaque connexion entrante Transmission sur les entrées- sorties standards
  18. 18. Exemple : myecho Code PHP #!/usr/bin/php <?php while (!feof(STDIN)) { $s = fgets(STDIN); print($s); } ?> /home/amaury/myecho.php
  19. 19. Exemple : myecho Configuration xinetd service myecho { type = UNLISTED user = root wait = no port = 11138 server = /home/amaury/myecho.php protocol = tcp socket_type = stream } /etc/xinetd.d/myecho
  20. 20. (x)inetd Avantages Inconvénients Développement rapide Consommation mémoire Aucune dépendance Lenteur d'instanciation Isolation des processus Couche intermédiaire
  21. 21. Benchmark : connexion unique Type Connexion Échange 1 Échange 2 C 5 µs 3 µs 2 µs xinetd 5 µs 31 ms 2 µs
  22. 22. Benchmark : connexions multiples 100 100 1000 1000 Type Maximum connexions messages connexions messages C 0.04 s 0.05 s 6.5 s 0.2 s > 1000 xinetd 0.4 s 1.8 s - - < 120
  23. 23. Démons multi-processus
  24. 24. Principe Simple : inetd internalisé Un processus attend les connexions Création d'un nouveau sous-processus à chaque connexion entrante
  25. 25. Exemple : myecho Code PHP #!/usr/bin/php <?php daemonize(); $socket = stream_socket_server('tcp://0.0.0.0:11138', $errno, $errstr); while (true) { $clientSock = stream_socket_accept($socket, -1); if (pcntl_fork() === 0) { fclose($socket); process($clientSock); exit(0); } fclose($clientSock); }
  26. 26. Exemple : myecho Code PHP function daemonize() { pcntl_signal(SIGCHLD, SIG_IGN); if (pcntl_fork()) exit(0); posix_setsid(); } function process($sock) { while (!feof($sock)) { $s = fgets($sock); fwrite($sock, $s); } fclose($sock); }
  27. 27. Multi-processus Avantages Inconvénients Latence réduite Consommation mémoire Aucune dépendance Gestion des signaux Isolation des processus PHP non multi-thread
  28. 28. Benchmark : connexion unique Type Connexion Échange 1 Échange 2 C 5 µs 3 µs 2 µs xinetd 5 µs 31 ms 2 µs multi 5 µs 8 µs 2 µs
  29. 29. Benchmark : connexions multiples 100 100 1000 1000 Type Maximum connexions messages connexions messages C 0.04 s 0.05 s 6.5 s 0.2 s > 1000 xinetd 0.4 s 1.8 s - - < 120 multi 3s 0.05 s 60.5 s 0.2 s > 1000
  30. 30. Démons mono-processus
  31. 31. Principe Un seul processus > attend les nouvelles connexions > répond aux requêtes
  32. 32. Mono versus multi-processus Multi Mono I/O lentes I/O rapides Code simple Partage de données Limites vite atteintes Seul moyen de gérer beaucoup de connexions
  33. 33. Exemple : myecho Code PHP #!/usr/bin/php <?php daemonize(); $socket = stream_socket_server('tcp://0.0.0.0:11138', $errno, $errs); $allSockets = array($socket); while (true) { $read = $allSockets; stream_select($read, $w=null, $e=null, null); foreach ($read as $sock) { if ($sock === $socket) $allSockets[] = stream_socket_accept($socket, -1); else if (feof($sock)) closeSocket($sock, $allSockets); else process($sock); } }
  34. 34. Exemple : myecho Code PHP function closeSocket($sock, &$allSockets) { fclose($sock); $key = array_search($sock, $allSockets); unset($allSockets[$key]); } function process($socket) { $s = fgets($socket); fwrite($socket, $s); }
  35. 35. Mono-processus Avantages Inconvénients Ressources préservées Délai exponentiel Aucune dépendance Blocage sur I/O lentes Partage de données Fragilité relative (consommation mémoire, plantage applicatif, ...)
  36. 36. Benchmark : connexion unique Type Connexion Échange 1 Échange 2 C 5 µs 3 µs 2 µs xinetd 5 µs 31 ms 2 µs multi 5 µs 8 µs 2 µs mono 5 µs 3 µs 3 µs
  37. 37. Benchmark : connexions multiples 100 100 1000 1000 Type Maximum connexions messages connexions messages C 0.04 s 0.05 s 6.5 s 0.2 s > 1000 xinetd 0.4 s 1.8 s - - < 120 multi 3s 0.05 s 60.5 s 0.2 s > 1000 mono 0.04 s 0.05 s 57.5 s 3.6 s > 1000
  38. 38. ZeroMQ
  39. 39. Présentation Bibliothèque de fonctions réseau Gestion de files de messages Protocole spécifique 37 langages supportés Redéfinition des concepts réseau
  40. 40. Méthodes de transport Inter-threads inproc Inter-processus ipc Inter-machines tcp
  41. 41. Découplage du sens de connexion Client Serveur
  42. 42. Découplage du sens de connexion Client Serveur
  43. 43. Socket multi-connexion Client port A Client Serveur Client port B
  44. 44. Polling Socket ZMQ Socket TCP Socket ZMQ Socket TCP STDIN Serveur
  45. 45. Connexion REQ/REP REQ Client Serveur
  46. 46. Connexion REQ/REP REP Client Serveur
  47. 47. Connexion PUSH/PULL PUSH Client Serveur
  48. 48. Connexion PUSH/PULL PULL Client Serveur
  49. 49. Connexion PUB/SUB Client PUB Serveur Client Client
  50. 50. Connexion PUB/SUB SUB Client SUB Serveur Client SUB Client
  51. 51. Load-balancing PULL Client PUSH Serveur Client Client
  52. 52. Load-balancing Client PUSH PULL Serveur Client Client
  53. 53. Load-balancing Client PUSH Serveur Client PULL Client
  54. 54. Pipeline Client Worker Client Worker Client Worker
  55. 55. ZeroMQ : Installation Linux Ubuntu 11.10 # apt-get install libzmq-dev # apt-get install php-pear # pear channel-discover pear.zero.mq # pecl install zero.mq/zmq-beta # echo "extension=zmq.so" > /etc/php5/conf.d/zmq.ini
  56. 56. Exemple : myecho Code PHP : serveur ZMQ #!/usr/bin/php <?php $ctx = new ZMQContext(); $server = new ZMQSocket($ctx, ZMQ::SOCKET_REP); $server->bind('tcp://*:11141'); while (true) { $message = $server->recv(); $server->send($message); }
  57. 57. Exemple : myecho Code PHP : client ZMQ #!/usr/bin/php <?php $ctx = new ZMQContext(); $client = new ZMQSocket($ctx, ZMQ::SOCKET_REQ); $client->connect('tcp://localhost:11141'); $client->send('bonjour'); $response = $client->recv(); print("Réponse : '$response'n");
  58. 58. Benchmark : connexion unique Type Connexion Échange 1 Échange 2 C 5 µs 3 µs 2 µs xinetd 5 µs 31 ms 2 µs multi 5 µs 8 µs 2 µs mono 5 µs 3 µs 3 µs zmq 2 ms 2 ms 4 µs
  59. 59. Benchmark : connexions multiples 100 100 1000 1000 Type Maximum connexions messages connexions messages C 0.04 s 0.05 s 6.5 s 0.2 s > 1000 xinetd 0.4 s 1.8 s - - < 120 multi 3s 0.05 s 60.5 s 0.2 s > 1000 mono 0.04 s 0.05 s 57.5 s 3.6 s > 1000 zmq 0.05 s 0.12 s 0.6 s 0.8 s > 1000
  60. 60. Conclusion
  61. 61. Démons en PHP Faciles et rapides à coder Vraiment performant (x)inetd, mono/multi-processus, ZeroMQ, libevent, eio, ...
  62. 62. geek-directeur-technique.com/zeromq amaury@amaury.net
  • geoffroy-aubry

    Jun. 11, 2014
  • Gronghon

    Jun. 2, 2013
  • hugdubois

    Sep. 1, 2012
  • gregoryeve

    Jun. 8, 2012
  • posejeremy

    Jun. 7, 2012
  • euskadi31

    Jun. 6, 2012

Version simplifiée de la conférence «Démons en PHP, de inetd à ZeroMQ», présentée pour la première fois le 6 juin 2012 au Forum PHP.

Views

Total views

8,845

On Slideshare

0

From embeds

0

Number of embeds

2,985

Actions

Downloads

43

Shares

0

Comments

0

Likes

6

×