SlideShare une entreprise Scribd logo
1  sur  63
Télécharger pour lire hors ligne
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 »

    Programme indépendant
                   Tourne en tâche de fond

    Serveur logiciel
          Accepte des connexions entrantes
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
Mais pourtant...


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




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



   Démon
                     Application
traitement
                     PHP
   images




                     Stockage

 Traitement images
Navigateur
                         Démon
    web                  HTTP




                         Application
                         PHP
images    vidéos   sms




                         File de
                         messages
Navigateur
                        Démon
   web                  HTTP




                        Serveur
                        de jeu

Serveur
websocket     Univers
              de jeu
Démons en PHP

          Avantages      Inconvénients

Développement rapide     Connaissances requises

Bonnes performances      Consommation mémoire

 Réutilisation de code
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
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);         }
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
Benchmark : connexion unique

   Type    Connexion   Échange 1   Échange 2

    C        5 µs        3 µs        2 µs
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
Démons basés
 sur (x)inetd
(x)inetd : super-démon


Écoute plusieurs ports

Instancie un programme à
chaque connexion entrante

Transmission sur les entrées-
sorties standards
Exemple : myecho

                 Code PHP

#!/usr/bin/php
<?php

while (!feof(STDIN)) {
    $s = fgets(STDIN);
    print($s);
}

?>
       /home/amaury/myecho.php
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
(x)inetd

           Avantages      Inconvénients

Développement rapide      Consommation mémoire

  Aucune dépendance       Lenteur d'instanciation

Isolation des processus   Couche intermédiaire
Benchmark : connexion unique

   Type     Connexion   Échange 1   Échange 2

     C        5 µs        3 µs        2 µs

   xinetd     5 µs       31 ms        2 µs
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
Démons
multi-processus
Principe


Simple : inetd internalisé

Un processus attend les connexions

Création d'un nouveau sous-processus
à chaque connexion entrante
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);
}
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);
}
Multi-processus

           Avantages      Inconvénients

       Latence réduite    Consommation mémoire

  Aucune dépendance       Gestion des signaux

Isolation des processus   PHP non multi-thread
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
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
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      Partage de données

Limites vite atteintes   Seul moyen de gérer
                         beaucoup de connexions
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);
   }
}
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);
}
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, ...)
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
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
ZeroMQ
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
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



                  Serveur
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
                  Client
Load-balancing

                 PULL
                        Client


          PUSH
Serveur                 Client



                        Client
Load-balancing


                        Client


          PUSH   PULL
Serveur                 Client



                        Client
Load-balancing


                        Client


          PUSH
Serveur                 Client


                 PULL
                        Client
Pipeline


Client              Worker



Client              Worker



Client              Worker
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
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);
}
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");
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
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
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

Contenu connexe

Tendances

Sécurité et Quaité de code PHP
Sécurité et Quaité de code PHPSécurité et Quaité de code PHP
Sécurité et Quaité de code PHPJean-Marie Renouard
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensionsjulien pauli
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresECAM Brussels Engineering School
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHPAbdoulaye Dieng
 
PHP & MYSQL #5 : fonctions
PHP & MYSQL #5 :  fonctionsPHP & MYSQL #5 :  fonctions
PHP & MYSQL #5 : fonctionsJean Michel
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniShellmates
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
PHP #2 : variables, conditions & boucles
PHP #2 : variables, conditions & boucles PHP #2 : variables, conditions & boucles
PHP #2 : variables, conditions & boucles Jean Michel
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScriptKristen Le Liboux
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsAurélien Regat-Barrel
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeadsRNS
 

Tendances (19)

Python avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiersPython avancé : Lecture et écriture de fichiers
Python avancé : Lecture et écriture de fichiers
 
Sécurité et Quaité de code PHP
Sécurité et Quaité de code PHPSécurité et Quaité de code PHP
Sécurité et Quaité de code PHP
 
Cours php
Cours phpCours php
Cours php
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Auto formation *WinDev
Auto formation *WinDev Auto formation *WinDev
Auto formation *WinDev
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
 
PHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_ExtensionsPHPTour-2011-PHP_Extensions
PHPTour-2011-PHP_Extensions
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulières
 
Cours javascript v1
Cours javascript v1Cours javascript v1
Cours javascript v1
 
.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 
PHP & MYSQL #5 : fonctions
PHP & MYSQL #5 :  fonctionsPHP & MYSQL #5 :  fonctions
PHP & MYSQL #5 : fonctions
 
Introduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El HassaniIntroduction à Python - Achraf Kacimi El Hassani
Introduction à Python - Achraf Kacimi El Hassani
 
Gestion de formulaires en PHP
Gestion de formulaires en PHPGestion de formulaires en PHP
Gestion de formulaires en PHP
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
PHP #2 : variables, conditions & boucles
PHP #2 : variables, conditions & boucles PHP #2 : variables, conditions & boucles
PHP #2 : variables, conditions & boucles
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
Introduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomicsIntroduction au lock-free programming avec std::atomics
Introduction au lock-free programming avec std::atomics
 
CocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central DispatchCocoaHeads Rennes #1 : Grand Central Dispatch
CocoaHeads Rennes #1 : Grand Central Dispatch
 

En vedette

ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The AnswerIan Barber
 
Organisation personnelle : GTD et matrice d'Eisenhower (Lightning Talk)
Organisation personnelle : GTD et matrice d'Eisenhower (Lightning Talk)Organisation personnelle : GTD et matrice d'Eisenhower (Lightning Talk)
Organisation personnelle : GTD et matrice d'Eisenhower (Lightning Talk)Amaury Bouchard
 
GTD Modèles papiers couleur à imprimer (hPDA)
GTD Modèles papiers couleur à imprimer (hPDA)GTD Modèles papiers couleur à imprimer (hPDA)
GTD Modèles papiers couleur à imprimer (hPDA)Nicolas Stampf
 
GTD Petits modèles à imprimer pour formation
GTD Petits modèles à imprimer pour formationGTD Petits modèles à imprimer pour formation
GTD Petits modèles à imprimer pour formationNicolas Stampf
 
Getting Things Done (GTD)
Getting Things Done (GTD)Getting Things Done (GTD)
Getting Things Done (GTD)Shake Your Mind
 

En vedette (7)

Présentation GTD
Présentation GTDPrésentation GTD
Présentation GTD
 
ZeroMQ Is The Answer
ZeroMQ Is The AnswerZeroMQ Is The Answer
ZeroMQ Is The Answer
 
Triptyque GTD
Triptyque GTDTriptyque GTD
Triptyque GTD
 
Organisation personnelle : GTD et matrice d'Eisenhower (Lightning Talk)
Organisation personnelle : GTD et matrice d'Eisenhower (Lightning Talk)Organisation personnelle : GTD et matrice d'Eisenhower (Lightning Talk)
Organisation personnelle : GTD et matrice d'Eisenhower (Lightning Talk)
 
GTD Modèles papiers couleur à imprimer (hPDA)
GTD Modèles papiers couleur à imprimer (hPDA)GTD Modèles papiers couleur à imprimer (hPDA)
GTD Modèles papiers couleur à imprimer (hPDA)
 
GTD Petits modèles à imprimer pour formation
GTD Petits modèles à imprimer pour formationGTD Petits modèles à imprimer pour formation
GTD Petits modèles à imprimer pour formation
 
Getting Things Done (GTD)
Getting Things Done (GTD)Getting Things Done (GTD)
Getting Things Done (GTD)
 

Similaire à Démons en PHP, de inetd à ZeroMQ

Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec GoMickaël Rémond
 
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Normandie Web Xperts
 
Les socket ing1_issat
Les socket ing1_issatLes socket ing1_issat
Les socket ing1_issatsloumaallagui
 
Utilisation de services Web sécurisés en Java en environnement Open Source
Utilisation de services Web sécurisés en Java en environnement Open SourceUtilisation de services Web sécurisés en Java en environnement Open Source
Utilisation de services Web sécurisés en Java en environnement Open Sourceguest3be047
 
Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c mouad Lousimi
 
Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Olivier Le Goaër
 
gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !David Caramelo
 
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018Carles Sistare
 
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...Microsoft Technet France
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !Carles Sistare
 
gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!David Caramelo
 
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...Microsoft Décideurs IT
 

Similaire à Démons en PHP, de inetd à ZeroMQ (20)

Messaging temps réel avec Go
Messaging temps réel avec GoMessaging temps réel avec Go
Messaging temps réel avec Go
 
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
Conférence #nwx2014 - Maxime Mauchaussée - Partager du code maintenable et év...
 
Les socket ing1_issat
Les socket ing1_issatLes socket ing1_issat
Les socket ing1_issat
 
Utilisation de services Web sécurisés en Java en environnement Open Source
Utilisation de services Web sécurisés en Java en environnement Open SourceUtilisation de services Web sécurisés en Java en environnement Open Source
Utilisation de services Web sécurisés en Java en environnement Open Source
 
Les sockets.pptx
Les sockets.pptxLes sockets.pptx
Les sockets.pptx
 
Socket tcp ip client server on langace c
Socket tcp ip client server on langace c Socket tcp ip client server on langace c
Socket tcp ip client server on langace c
 
Protocoles SSL/TLS
Protocoles SSL/TLSProtocoles SSL/TLS
Protocoles SSL/TLS
 
Introduction aux-sockets
Introduction aux-socketsIntroduction aux-sockets
Introduction aux-sockets
 
02 java-socket
02 java-socket02 java-socket
02 java-socket
 
Vert.x
Vert.xVert.x
Vert.x
 
spring.pdf
spring.pdfspring.pdf
spring.pdf
 
Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !Les Web Services en 60 diapos chrono !
Les Web Services en 60 diapos chrono !
 
gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !gRPC, échange à haute fréquence !
gRPC, échange à haute fréquence !
 
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
gRPC, ECHANGES A HAUTE FREQUENCE ! DEVOXX 2018
 
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !
 
gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
Tester la sécurité de votre annuaire Active Directory : top 10 des menaces et...
 

Plus de Amaury Bouchard

De 0 à 10 millions de visiteurs uniques avec les moyens d'une startup
De 0 à 10 millions de visiteurs uniques avec les moyens d'une startupDe 0 à 10 millions de visiteurs uniques avec les moyens d'une startup
De 0 à 10 millions de visiteurs uniques avec les moyens d'une startupAmaury Bouchard
 
Créer une base NoSQL en 1 heure
Créer une base NoSQL en 1 heureCréer une base NoSQL en 1 heure
Créer une base NoSQL en 1 heureAmaury Bouchard
 
Architectures réparties en environnement web
Architectures réparties en environnement webArchitectures réparties en environnement web
Architectures réparties en environnement webAmaury Bouchard
 
De geek à directeur technique - Conférence SupInfo 2010
De geek à directeur technique - Conférence SupInfo 2010De geek à directeur technique - Conférence SupInfo 2010
De geek à directeur technique - Conférence SupInfo 2010Amaury Bouchard
 
De geek à directeur technique - Conférence Université de Montréal 2010
De geek à directeur technique - Conférence Université de Montréal 2010De geek à directeur technique - Conférence Université de Montréal 2010
De geek à directeur technique - Conférence Université de Montréal 2010Amaury Bouchard
 
De geek à directeur technique - Conférence UQÀM 2010
De geek à directeur technique - Conférence UQÀM 2010De geek à directeur technique - Conférence UQÀM 2010
De geek à directeur technique - Conférence UQÀM 2010Amaury Bouchard
 
De geek à directeur technique - Conférence Epitech 2010
De geek à directeur technique - Conférence Epitech 2010De geek à directeur technique - Conférence Epitech 2010
De geek à directeur technique - Conférence Epitech 2010Amaury Bouchard
 

Plus de Amaury Bouchard (7)

De 0 à 10 millions de visiteurs uniques avec les moyens d'une startup
De 0 à 10 millions de visiteurs uniques avec les moyens d'une startupDe 0 à 10 millions de visiteurs uniques avec les moyens d'une startup
De 0 à 10 millions de visiteurs uniques avec les moyens d'une startup
 
Créer une base NoSQL en 1 heure
Créer une base NoSQL en 1 heureCréer une base NoSQL en 1 heure
Créer une base NoSQL en 1 heure
 
Architectures réparties en environnement web
Architectures réparties en environnement webArchitectures réparties en environnement web
Architectures réparties en environnement web
 
De geek à directeur technique - Conférence SupInfo 2010
De geek à directeur technique - Conférence SupInfo 2010De geek à directeur technique - Conférence SupInfo 2010
De geek à directeur technique - Conférence SupInfo 2010
 
De geek à directeur technique - Conférence Université de Montréal 2010
De geek à directeur technique - Conférence Université de Montréal 2010De geek à directeur technique - Conférence Université de Montréal 2010
De geek à directeur technique - Conférence Université de Montréal 2010
 
De geek à directeur technique - Conférence UQÀM 2010
De geek à directeur technique - Conférence UQÀM 2010De geek à directeur technique - Conférence UQÀM 2010
De geek à directeur technique - Conférence UQÀM 2010
 
De geek à directeur technique - Conférence Epitech 2010
De geek à directeur technique - Conférence Epitech 2010De geek à directeur technique - Conférence Epitech 2010
De geek à directeur technique - Conférence Epitech 2010
 

Démons en PHP, de inetd à ZeroMQ

  • 1. Démons en PHP de inetd à ZeroMQ
  • 2. Démons en PHP Introduction Démons basés sur (x)inetd Démons multi-processus Démons mono-processus ZeroMQ
  • 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. 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. Mais pourtant... Le démon d'une application web, c'est Apache / Lighttpd / Nginx ! C'est de moins en moins vrai
  • 7. Navigateur Démon web HTTP Démon Application traitement PHP images Stockage Traitement images
  • 8. Navigateur Démon web HTTP Application PHP images vidéos sms File de messages
  • 9. Navigateur Démon web HTTP Serveur de jeu Serveur websocket Univers de jeu
  • 10. Démons en PHP Avantages Inconvénients Développement rapide Connaissances requises Bonnes performances Consommation mémoire Réutilisation de code
  • 11.
  • 12. 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
  • 13. 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); }
  • 14. 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
  • 15. Benchmark : connexion unique Type Connexion Échange 1 Échange 2 C 5 µs 3 µs 2 µs
  • 16. 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
  • 17. Démons basés sur (x)inetd
  • 18. (x)inetd : super-démon Écoute plusieurs ports Instancie un programme à chaque connexion entrante Transmission sur les entrées- sorties standards
  • 19. Exemple : myecho Code PHP #!/usr/bin/php <?php while (!feof(STDIN)) { $s = fgets(STDIN); print($s); } ?> /home/amaury/myecho.php
  • 20. 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
  • 21. (x)inetd Avantages Inconvénients Développement rapide Consommation mémoire Aucune dépendance Lenteur d'instanciation Isolation des processus Couche intermédiaire
  • 22. Benchmark : connexion unique Type Connexion Échange 1 Échange 2 C 5 µs 3 µs 2 µs xinetd 5 µs 31 ms 2 µs
  • 23. 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
  • 25. Principe Simple : inetd internalisé Un processus attend les connexions Création d'un nouveau sous-processus à chaque connexion entrante
  • 26. 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); }
  • 27. 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); }
  • 28. Multi-processus Avantages Inconvénients Latence réduite Consommation mémoire Aucune dépendance Gestion des signaux Isolation des processus PHP non multi-thread
  • 29. 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
  • 30. 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
  • 32. Principe Un seul processus > attend les nouvelles connexions > répond aux requêtes
  • 33. 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
  • 34. 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); } }
  • 35. 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); }
  • 36. 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, ...)
  • 37. 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
  • 38. 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
  • 40. 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
  • 41. Méthodes de transport Inter-threads inproc Inter-processus ipc Inter-machines tcp
  • 42. Découplage du sens de connexion Client Serveur
  • 43. Découplage du sens de connexion Client Serveur
  • 44. Socket multi-connexion Client port A Client Serveur Client port B
  • 45. Polling Socket ZMQ Socket TCP Socket ZMQ Socket TCP STDIN Serveur
  • 46. Connexion REQ/REP REQ Client Serveur
  • 47. Connexion REQ/REP REP Client Serveur
  • 48. Connexion PUSH/PULL PUSH Client Serveur
  • 49. Connexion PUSH/PULL PULL Client Serveur
  • 50. Connexion PUB/SUB Client PUB Serveur Client Client
  • 51. Connexion PUB/SUB SUB Client SUB Serveur Client SUB Client
  • 52. Load-balancing PULL Client PUSH Serveur Client Client
  • 53. Load-balancing Client PUSH PULL Serveur Client Client
  • 54. Load-balancing Client PUSH Serveur Client PULL Client
  • 55. Pipeline Client Worker Client Worker Client Worker
  • 56. 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
  • 57. 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); }
  • 58. 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");
  • 59. 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
  • 60. 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
  • 62. Démons en PHP Faciles et rapides à coder Vraiment performant (x)inetd, mono/multi-processus, ZeroMQ, libevent, eio, ...