8288 sujets

Développement web côté serveur, CMS

Bonjour,

Actuellement entrain de développer un système d'Infos Trafic pour une compagnie de transport, je dois envoyer des SMS pour informer les usagers à la publication d'une alerte.
J'ai crée un script fonctionnel mais alors vraiment pas optimisé..
J'ai honte d'avoir pondu un truc pareil Smiley sweatdrop

J'aimerais bien obtenir le même résultat mais je ne sais pas vraiment comment m'y prendre..

Voici le script en question (alerte_SMS.php) :

<?php 
require '../../../includes/config.php';

require '../vendor/autoload.php';
use \Ovh\Api;

$endpoint = 'xxxx';
$applicationKey = "xxxx";
$applicationSecret = "xxxx";
$consumer_key = "xxxx";

//Connexion à l'API OVH
$conn = new Api($applicationKey, $applicationSecret, $endpoint, $consumer_key);
                    
                    
//Recherche si une alerte est à publier 
$ReqInfosTrafic = $bdd->query("SELECT * FROM infostrafic WHERE CURRENT_TIMESTAMP() BETWEEN date_pub AND date_fin AND SMS = 1"); 
while ($data_InfosTrafic = $ReqInfosTrafic->fetch()) { 
 
//Récupère le numéro des lignes concernées 
$InfosTrafic_ligne = strtok($data_InfosTrafic['lignes'], ",");

while ($InfosTrafic_ligne !== false) {
$InfosTrafic_ligne = strtok(",");
$ReqLignesPourInfosTrafic = $bdd->query("SELECT * FROM data_lignes WHERE IDlignes = '{$InfosTrafic_ligne}'"); 
while ($data_lignes = $ReqLignesPourInfosTrafic->fetch()) { 
    
//Récupère le numéro de téléphone du client en fonction de ses alertes  
$ReqClientsAlertes = $bdd->query("SELECT * FROM clients_alertes a INNER JOIN clients c ON c.IDclient = a.client_ID WHERE a.SMS = 1 AND a.ligne_ID = '{$data_lignes['IDlignes']}'"); 
                               while ($data_ClientsAlertes = $ReqClientsAlertes->fetch()) {  
                               
//Envoi du SMS                              
$smsServices = $conn->get('/sms');

foreach ($smsServices as $smsService) {

    print_r($smsService);
}

$content = (object) array(
    "charset"=> "UTF-8",
    "class"=> "phoneDisplay",
    "coding"=> "7bit",
    "message"=> $data_InfosTrafic['titre']." PLUS D'INFOS  http://citel.dev/s/".$data_InfosTrafic['IDalerte'], 
    "noStopClause"=> true,
    "priority"=> "high",
    "receivers"=> [ $data_ClientsAlertes['telephone'] ],
    "sender" => $nom_service,
    "senderForResponse"=> false,
    "validityPeriod"=> 2880
);
$resultPostJob = $conn->post('/sms/'. $smsServices[0] . '/jobs', $content);

print_r($resultPostJob);

$smsJobs = $conn->get('/sms/'. $smsServices[0] . '/jobs');
print_r($smsJobs);
                               

} $ReqClientsAlertes->closeCursor();                              
                              
} $ReqLignesPourInfosTrafic->closeCursor(); }  
 
  
} $ReqInfosTrafic->closeCursor();


NOTE: Ce script est exécuté via une tache CRON toutes les 2 minutes.

Merci Smiley smile
Hello,

Ton modèle relationnel ressemble à quoi déjà ?
Car c'est ce qui devrait être ta priorité dans cette problématique.
Si le modèle de donnée tient la route, une requête SQL optimisée avec quelques jointures t’éviterait toutes ces boucles imbriquées.
Tu n'aurais qu'à boucler sur ton jeu de données pour envoyer le SMS à chaque client.
Salut,
Alors depuis j'ai modifié et j'ai en effet utilisé des jointures :


<?php
require '../../../includes/sql.php';
require '../vendor/autoload.php';
use \Ovh\Api;

$endpoint = 'ovh-eu';
$applicationKey = "xxxx";
$applicationSecret = "xxxx";
$consumer_key = "xxxx";
$account = 'xxxx';
$sender = 'xxxx';

$conn = new Api($applicationKey, $applicationSecret, $endpoint, $consumer_key);

$ReqSMS = $bdd->query("SELECT * FROM infostrafic_alertes ITA 
INNER JOIN infostrafic IT ON ITA.ID_alerte = IT.IDalerte 
INNER JOIN clients_alertes CA ON ITA.ID_ligne = CA.ligne_ID 
INNER JOIN clients C ON CA.client_ID = C.IDclient 
WHERE CURRENT_TIMESTAMP() BETWEEN IT.date_pub AND IT.date_fin AND ITA.SMS = 1 AND CA.SMS = 1 
GROUP BY CA.client_ID, ITA.ID_alerte 
ORDER BY IT.IDalerte DESC"); 
 

while ($SMS = $ReqSMS->fetch()) { 

$content = (object) array(
    "charset"=> "UTF-8",
    "class"=> "phoneDisplay",
    "coding"=> "7bit",
    "message"=> $data_InfosTrafic['titre']." PLUS D'INFOS   http://citel.dev/s/".$data_InfosTrafic['IDalerte'], 
    "noStopClause"=> true,
    "priority"=> "high",
    "receivers"=> [ $SMS['telephone'] ],
    "sender" => $sender,
    "senderForResponse"=> false,
    "validityPeriod"=> 2880
);
$resultPostJob = $conn->post('/sms/'.$account.'/jobs', $content);
$ReqSMSOk = $bdd->query("UPDATE infostrafic_alertes SET SMS = 2 WHERE ID_notification = '{$SMS['ID_notification']}'");


} $ReqSMS->closeCursor();


Voilà Smiley smile
Mais merci quand même pour ta réponse Smiley cligne
Meilleure solution