Bonjour Gilles, et merci pour le ticket. J’ai demandé la création d’un compte sur la forge SPIP, mais attendant son approbation éventuelle, je vais commenter ici. Je précise que je suis un développeur professionnel, même si je n’ai pas touché au code de SPIP depuis sa version 0.6 (puis j’ai vaqué à d’autres occupations professionnelles...).
Les commentaires, donc :
– Les problèmes rapportés d’extrême lenteur de la fonction fsockopen semblent être commun sur Internet. Voir par exemple le post qui propose des solutions : http://stackoverflow.com/questions/5211658/php-fsockopen-painfully-slow
– Notamment, il est rapporté que la résolution DNS de cette fonction est catastrophique, et qu’elle est déjà beaucoup plus rapide en externalisant cette résolution via la fonction gethostbyname. Ex : $sock=fsockopen(gethostbyname(’www.site.com’), 80) plutôt que $sock=fsockopen(www.site.com’, 80) ;
– Il apparaît également que le timeout utilisé dans queue.php semble trop long (1s). Je suggèrerait plutôt 10 fois moins au maximum !
– La partie du code avec le commentaire //ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent// semble intéressante, mais il y a conflit avec cette durée (une seconde) et le timeout de la fonction fsockopen (une seconde aussi). Si fsockopen foire en timeout, et que la fonction queue_affichage_cron() est rappelée, la fonction va se relancer quand même et "bloquer en rond" car le touch($lock) est effectué AVANT le fsockopen. Même après avoir diminué le timeout de fsockopen à 100ms, je passerais quand même ce délai en 2 appels minimum à 30s, pour être sûr que pour un même utilisateur / même session, un seul appel soit affectué par page affichée.
– à tout hasard, si les recommandations ci-dessus étaient sans intérêt, je suggère de passer fsockopen, qui semble poser beaucoup de problème, après le curl. Si le curl ne fonctionne pas, on essaie fsockopen, mais avec mes recommandations ci-dessus.
Évidemment, l’idéal, serait que j’arrête de donner des conseils et que j’essaie de proposer une version corrigée de queue.php moi-même. Avec un parangonnage complet entre les différentes solutions. Je ne promet rien mais je vais essayer ;-)