Close search
Hoa

Hack book de Hoa\Zombie

Un zombie est un processus qui n'est ni actif, ni terminé : il est entre la vie et la mort. Hoa\Zombie permet de transformer une exécution PHP en zombie !

Table des matières

  1. Introduction
  2. Manipuler des zombies
  3. Exemple
  4. Conclusion

Introduction

Placer un processus entre la vie et la mort est en général à éviter car cela est souvent synonyme de dysfonctionnement. Toutefois, il peut arriver que ce soit astucieux de le faire, notamment dans le cas de démons (voir Hoa\Worker). Il est à noter qu'un zombie est également muet : il ne peut plus écrire sur la sortie standard puisqu'il n'est théoriquement plus attaché à aucun processus parent.

Actuellement, Hoa\Zombie ne permet de créer des zombies que s'il est utilisé derrière PHP FPM. Rappelons-nous du fonctionnement de PHP : un serveur FastCGI (comme PHP FastCGI ou PHP FPM) va démarrer un processus PHP quand une requête arrive et la terminer quand la réponse est envoyée. D'une certaine manière, le processus PHP est synchronisé sur le protocole FastCGI. Heureusement, quand nous utilisons PHP FPM, nous pouvons désynchroniser ce protocole, et ainsi créer des zombies tout en délégant la gestion des processus à PHP FPM !

Manipuler des zombies

Créer un zombie est très simple : il suffit d'appeler la méthode Hoa\Zombie\Zombie::fork().

Il est de notoriété publique que tuer un zombie est une activité amusante, d'autant plus si nous avons le choix des armes ! C'est pourquoi Hoa\Zombie\Zombie propose les méthodes suivantes :

Toutes ces méthodes ont fait leurs preuves. Ainsi :

// I'm alive!
Hoa\Zombie\Zombie::fork();
// I'm a zombie!
Hoa\Zombie\Zombie::decapitate();
// I'm dead…

Hoa\Zombie\Zombie propose également d'obtenir l'identifiant du processus, ce qui peut parfois être utile, à travers la méthode Hoa\Zombie\Zombie::getPid. Enfin, il existe la méthode Hoa\Zombie\Zombie::test qui permet de savoir si nous pouvons créer un zombie ou pas.

Exemple

Pour créer un zombie, nous avons dit qu'il fallait utiliser PHP FPM. Ensuite, nous avons plusieurs possibilités pour exécuter notre programme PHP qui sera notre futur zombie : soit à travers HTTP (qui fera automatiquement une requête FastCGI vers PHP FPM) ou alors directement en émettant une requête FastCGI vers PHP FPM. C'est ce dernier choix que nous allons retenir.

Nous commençons avec le fichier Zombie.php :

echo 'I guess I am sick…', "\n";
Hoa\Zombie\Zombie::fork();

// Do whatever you want here, e.g.:
sleep(10);
file_put_contents(
    __DIR__ . DS . 'AMessage',
    'Hello from after-life… or somewhere about!'
);

Ensuite, nous continuons avec le fichier Run.php qui va exécuter Zombie.php grâce à Hoa\Fastcgi :

$fastcgi = new Hoa\Fastcgi\Responder(
    new Hoa\Socket\Client('tcp://127.0.0.1:9000')
);

// Start Zombie.php and print the response before it becomes undead.
echo $fastcgi->send([
    'GATEWAY_INTERFACE' => 'FastCGI/1.0',
    'REQUEST_METHOD'    => 'GET',
    'SCRIPT_FILENAME'   => __DIR__ . DS . 'Zombie.php'
]);

Et enfin, nous testons :

$ php-fpm -d listen=127.0.0.1:9000
$ php Run.php
I guess I am sick…

Et après 10 secondes, nous verrons le fichier AMessage apparaître et contenant Hello from after-life… or somewhere about!.

Nous pouvons créer un zombie à tout moment et le tuer comme nous le voulons. Si la fin du programme est atteinte, le zombie se tuera de lui-même. Nous anticiperons qu'un démon n'est finalement rien d'autre qu'un zombie qui démarre un serveur.

Conclusion

Hoa\Zombie permet de transformer un processus en zombie uniquement lorsqu'il est utilisé avec PHP FPM. Nous vous invitons à regarder Hoa\Worker pour un exemple d'utilisation plus complet.

Une erreur ou une suggestion sur la documentation ? Les contributions sont ouvertes !

Comments

menu