Coucoutte
Voilà, sur le site de la radio, j'ai un souci qui se produit de temps en temps, ce n’est pas super grave mais ça me dérange quand même .
Chaque visiteur déclenche toutes les 5 secondes, via une requête Ajax, l'exécution d'une page php qui :
- Récupère les titres joués depuis le dernier "ramassage", sur une base SQL distante (du PC Diffusion, RadioDJ) , et les ajoute à une table "historique".
- Récupère les titres à venir depuis cette même base, et met à jour une table "queuelist".
- Envoie un mail aux auditeurs enregistrés (compte tchat) ayant dans ses titres favoris, un des titres à venir, pour le prévenir qu'il va être joué dans quelques minutes.
- Gère le display et l'affichage des pochettes (en cours et 5 titres récemment joués).
Afin que le PC RadioDJ ne soit pas sursollicité (
x requêtes x le nombre de visiteur x 5 secondes), il y a un petit système en place :
Dans une table du site, le script note la date et heure du dernier ramassage et passe à 1 un paramètre de verrouillage. Lorsque le script st exécuté, il regarde ces 2 paramètres et si le dernier ramassage a plus de 5 secondes, il déverrouille, met à jour la date, reverrouille, et fait un nouveau ramassage.
Ainsi, le PC Radio DJ ne reçoit plus qu'une sollicitation toutes les 5 secondes au lieu de dizaines ou centaines (qui le faisaient freezer car n'a plus de temps pour lui, pour écrire dans sa DB).
Chaque ramassage est loggé dnas un fichier avec date et heure, et IP du déclencheur.
Seulement, de temps en temps, il se trouve que 2 visiteurs (dans les logs, ce sont bien 2 IP différentes pour la même heure de ramassage) déclenchent pile en même temps le script, qui est donc exécuté 2 fois (pas gênant à ce stade pour RadioDJ) ce qui entraîne :
- Ajout en double du titre en cours dans la table "historique"
- Envoie en double du mail de favoris si un mail devait être envoyé (cas statistiquement plus rare ceci dit).
Code : Tout sélectionner
$delta = strtotime($now) - strtotime($last_rdj_data);
// si dernier ramasse il y a plus de 5 sec ou si l'histo_lock est verrouillé depuis plus de 10 sec
if (($delta >= 5 && $histo_lock == 0) || ($delta >= 10 && $histo_lock == 1)) {
$sql = "UPDATE config SET valeur = '1' WHERE critere = 'histo_lock'";
$requete = mysqli_query( $dbwrite, $sql );
// On mets à jour l'heure du dernier essai ramassage sur la DB site
$sql = "UPDATE config SET valeur = '$now' WHERE critere = 'last_rdj_data'";
$requete = mysqli_query( $dbwrite, $sql );
$fp = fopen ("test5sec.txt", "a+");
fputs ($fp,"$now Delta : $delta s - Client : $client\n");
fclose ($fp);
[...]Ramassage des titres depuis la base RDJ, envoi des mails de favoris[...]
} // Fin du ramassage
[...]Gestion du display et des pochettes en fonction de ce qui est présent dans les tables de la base SQL du site[...]
Comment serait-il possible d’empêcher la partie ramassage de pouvoir être exécutée 2 (ou +) fois ? Je pensais que verrouiller et mettre à jour la date et heure du dernier ramassage serait suffisamment rapide pour pas qu'un autre exécute le script mais ce n'est pas 100% efficace (faut quand même le faire pour que ça tombe pile en même temps à la milliseconde ou quelques millisecondes près).
Si quelqu'un a une astuce à explorer
Merkouin !