Nous utilisons un métamoteur de recherche (comparaison de prix) où chaque recherche engendre un certain nombre de recherches en temps réel sur différents sites web et présente les résultats de recherche fusionnés et triés sur notre site.
Nous utilisons PHP/MySQL/Apache sur un serveur Linux Debian dans une configuration assez simple, mais le traitement de fond de la recherche de plusieurs sites en parallèle est géré par Tomcat et un servlet Java. Cependant, en raison de certains problèmes avec cette configuration (Tomcat), je cherche de nouvelles approches pour la recherche en arrière-plan.
Une méthode qui semble prometteuse est également très simple : À partir de la page de recherche principale, chaque script de recherche individuelle est exécuté en tant que CLI PHP en utilisant exec() :
exec("nohup /usr/bin/php search.php '$params' &> /dev/null &");
L'utilisation de l'esperluette à la fin envoie le CLI PHP scripts directement en arrière-plan et la page principale peut continuer sans attendre. Il y a environ 20 scripts en cours d'exécution pour chaque recherche.
Il semble fonctionner assez bien, mais lorsque j'exécute un test de stress à l'aide d'Apache Benchmark avec des requêtes simultanées, des problèmes commencent à apparaître. Ce qui se passe, c'est que MySQL signale cette erreur :
Impossible de se connecter au serveur MySQL local via le socket '/var/run/mysqld/mysqld.sock' (11)
Il semble qu'il s'agisse d'une variante de "Too many connections" (trop de connexions), mais cela ne sert à rien d'augmenter les limites dans my.cnf. Mais ce qui me rend vraiment perplexe, c'est que ces erreurs sont présentes même si j'appelle un petit script factice qui ne fait rien, et certainement pas d'accès à MySQL. Ainsi, il semble que le simple fait d'exécuter PHP CLI charge MySQL même s'il n'est pas utilisé.
Il y a tout au plus environ 700 instances de PHP en cours d'exécution pendant mes tests, et la charge du processeur et de la mémoire est plus faible que lorsque j'utilise Tomcat pour appeler les scripts de PHP, donc de ce point de vue, cela semble faisable.
Quelqu'un a-t-il une idée du problème MySQL ? Et bien sûr, je suis ouvert à de nouvelles idées sur la façon de gérer les tâches de fond !
Regards, Martin