Un long script d’exécution en PHP oblige le serveur NGINX à être très occupé

Je vais essayer d’être très précis à ce sujet – ce ne sera pas facile, alors essayez de suivre.

Nous avons un script qui fonctionne avec PHP sur NGINX – PHP-fpm FastCGI. Ce script obtient des informations de l’utilisateur essayant d’y accéder et exécute un algorithme en temps réel . Ce ne peut pas être un processus planifié en arrière-plan. Parfois, le chargement de la page dure entre 5 et 12 secondes – et ça va . De manière générale, nous collectons des données auprès de l’utilisateur et adressons plusieurs requêtes sortantes à des serveurs tiers, collectons les données, les analysons et retournons une réponse pour l’utilisateur.

Le problème est le suivant: de nombreux utilisateurs exécutent ce script, et le serveur est très occupé – car ils sont tous en connexion active sur le serveur, en attente d’une réponse. Nous avons 2 serveurs fonctionnant sous 1 équilibreur de charge, ce qui n’est pas suffisant. Parfois, les serveurs ont plus de 1 500 connexions actives à la fois. Vous pouvez imaginer comment ces serveurs répondent à cette période.

Je cherche une solution. Nous pouvons append de plus en plus de serveurs au LB, mais il semble absurde que ce soit la seule solution possible. Nous avons parcouru ce script et l’avons optimisé au maximum, je peux vous promettre que – Il n’y a pas de véritable solution pour la longue exécution de ce script, car cela dépend des serveurs tiers qui prennent le temps de nous répondre sur le trafic en direct. .

Y a-t-il une solution à laquelle vous pouvez penser pour conserver ce script tel quel, mais pour réduire l’impact de ces connexions actives sur le fonctionnement global des serveurs? Parfois, ils s’arrêtent simplement pour répondre.

Merci beaucoup pour la lecture!

Question de 3 mois, je sais, mais je ne peux pas l’aider en pensant que:

  1. Si vous êtes sûr que la sum du réseau fonctionne pour toutes les requêtes adressées aux serveurs tiers et que le traitement correspondant des réponses dans votre script PHP est bien inférieur aux limites de votre matériel.

  2. Votre script PHP est alors probablement inefficace en boucle jusqu’à ce que toutes les réponses reviennent des serveurs tiers

Si je traitais un tel problème, je le ferais:

  1. Arrêtez d’utiliser votre truc C ++ externe personnalisé, car le script PHP est occupé à l’attendre quand même.

  2. Google et lire sur l’utilisation en boucle non-occupée de l’implémentation curl-multi de PHP

J’espère que cela a du sens.

Mon conseil est de définir des délais d’ attente limités pour les requêtes et d’ utiliser des requêtes asynchrones pour chaque requête tierce.

Par exemple, pour votre page, vous devez afficher les résultats de 5 demandes de tiers. Cela signifie que le script interne que vous appelez cURL ou file_get_contents 5 fois, mais que le script est gelé pour chaque timeout de tiers. Pas à pas. Cela signifie que si vous devez attendre 10 secondes pour chaque réponse, vous aurez 50 secondes au total.
User calls the script -> script wait to end -> server is loaded for 50 seconds

Maintenant, si chaque demande à un tiers sera envoyée de manière asynchrone, le temps de chargement du script sera réduit au délai de requête maximal. Ainsi, vous aurez peu de scripts plus petits, qui dureront moins longtemps – et cela diminuera la charge sur le serveur.
User calls the script -> script is loaded -> requests are sent -> there are no scripts that are waiting for the response and consuming resources of your server

Que l’AJAX soit avec vous! 😉