Lancer des traitements asynchrones en PHP

Il y a différentes raisons de vouloir lancer des traitements asynchrones en PHP, les insertions de logs par exemple, où l’on a pas besoin d’attendre un retour pour continuer. Ou encore pour récupérer les différents éléments de contenu d’une page web simultanément, et ainsi réduire le temps nécessaire à l’affichage de la page. On peut aussi vouloir mettre en place un service qui lancera d’autres scripts, indépendants les uns des autres. Voici quelques une des possibilités qui existent pour effectuer des traitements asynchrones en PHP.

  • exec permet de faire des appels systèmes. Cette méthode prend en paramètre une ligne de commande comme vous la taperiez dans un terminal. Ajouter un & à la fin de cette ligne de commande permet de la lancer en tâche de fond et vous permet de ne pas attendre le résultat.
  • curl_multi_init permet de lancer plusieurs traitements cURL en parallèle. La fonctionnalité est très intéressante, en particulier quand il s’agit de faire plusieurs appels à des web-services pour récupérer du contenu.
  • Pcntl est une extension PHP implémentant un système de contrôle des processus permettant la gestion de tâches en parallèle. Comme le précise les premières lignes de la documentation, Pcntl n’est pas fait pour l’utilisation en mode web. Le contrôle de processus pouvant se révéler assez complexe, son utilisation est à réserver à des utilisateurs avertis.
  • fsockopen permet d’initialiser une connexion par socket, il suffit ensuite de poster des données avec fwrite par exemple. A noter qu’il est possible d’ouvrir une connexion persistante avec pfsockopen.
  • pg_send_query permet d’envoyer une requête SQL à une base de données PostgreSQL sans attendre le résultat. Si vous utilisez une base de données PostgreSQL, cette solution est sûrement la plus élégante et la plus simple à mettre en place pour insérer des logs dans une base de données. Si toutefois vous avez besoin du résultat de la ou des requêtes exécutées, pg_get_result permet de récupérer les résultats des différentes requêtes.

About the Author: Guillaume Luchet

Guillaume Luchet est Directeur de la R&D et Lead Développeur chez Bilendi Technology, entrepreneur et développeur freelance.