101 votes

Appel de fonction asynchrone en PHP

Je travaille sur une application web PHP et j'ai besoin d'effectuer certaines opérations de réseau dans la requête comme aller chercher quelqu'un sur un serveur distant en fonction de la requête de l'utilisateur.

Est-il possible de simuler un comportement asynchrone en PHP, étant donné que je dois passer des données à une fonction et que j'ai également besoin d'une sortie de celle-ci.

Mon code est comme :

<?php

     $data1 = processGETandPOST();
     $data2 = processGETandPOST();
     $data3 = processGETandPOST();

     $response1 = makeNetworkCall($data1);
     $response2 = makeNetworkCall($data2);
     $response3 = makeNetworkCall($data3);

     processNetworkResponse($response1);
     processNetworkResponse($response2);
     processNetworkResponse($response3);

     /*HTML and OTHER UI STUFF HERE*/

     exit;
?>

Chaque opération réseau prend environ 5 secondes, ce qui ajoute un total de 15 secondes au temps de réponse de mon application si je fais 3 demandes.

La fonction makeNetworkCall() effectue simplement une requête HTTP POST.

Le serveur distant est une API tierce, je n'ai donc aucun contrôle sur lui.

PS : Veuillez ne pas répondre en donnant des suggestions sur AJAX ou d'autres choses. Je suis actuellement en train de chercher si je peux faire cela à travers PHP, peut-être avec une extension C++ ou quelque chose comme ça.

31voto

aljo f Points 1485

De nos jours, il est préférable d'utiliser files d'attente que des threads (pour ceux qui n'utilisent pas Laravel, il existe des tonnes d'autres implémentations). comme ceci ).

L'idée de base est que votre script PHP original place les tâches ou les travaux dans une file d'attente. Ensuite, vous avez des travailleurs de la file d'attente qui s'exécutent ailleurs, prennent les tâches dans la file d'attente et commencent à les traiter indépendamment du PHP original.

Les avantages sont les suivants :

  1. Évolutivité - il suffit d'ajouter des nœuds de travail pour répondre à la demande. De cette façon, les tâches sont exécutées en parallèle.
  2. Fiabilité - les gestionnaires de file d'attente modernes tels que RabbitMQ, ZeroMQ, Redis, etc. sont conçus pour être extrêmement fiables.

9voto

Je n'ai pas de réponse directe, mais vous devriez peut-être vous pencher sur ces questions :

8voto

Jimmy Points 528

Cette vieille question a une nouvelle réponse. Il existe aujourd'hui quelques solutions "asynchrones" pour PHP (qui sont équivalentes au multiprocessus de Python dans le sens où elles créent de nouveaux processus PHP indépendants plutôt que de les gérer au niveau du framework).

Les deux solutions que j'ai vues sont

Essayez-les !

4voto

Colin Morelli Points 6539

CURL sera votre seul véritable choix ici (soit cela, soit l'utilisation de sockets non bloquants et une logique personnalisée).

Ce lien devrait vous mettre sur la bonne voie. Il n'y a pas de traitement asynchrone en PHP, mais si vous essayez de faire plusieurs requêtes web simultanées, cURL multi s'en chargera pour vous.

4voto

DRAX Points 3842

Je crois que la réponse se trouve ici :

Appel asynchrone d'une fonction php par un thread PHP

Note rapide : utiliser l'enfilage

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X