Je souhaiterais avoir votre avis afin d'optimiser le code source ci-dessous car les utilisateurs se plaignent de temps de réponse long lors du traitement du formulaire. Pour information, le serveur sur lequel est hébergé l'application n'est pas optimisé en ce qui concerne MySql, Php, Apache, mais ça ce n'est pas de mon ressort, c'est un autre service dans ma boîte qui doit s'en charger.
Voici un petit descriptif de l'application :
Sur un formulaire, j'ai un champ textarea (uniquement ce champ) qui contient un numéro pouvant aller de 17 à 19 caractères. D'après les utilisateurs, ils peuvent au maximum saisir jusqu'à 60 numéros. Au niveau des traitements, je dois traiter chaque numéro au cas par cas. Pour chaque numéro, je dois vérifier sa longueur et ajouter un ou deux zéros à telle position en fonction. Mais plutôt que tout décrire, voici le code. Mon souhait c'est optimiser pour que le traitement soit plus rapide si possible.
<?php
// Récupération des différents codebarre(numliaison)
$codebarre = explode("\n",trim($_POST['codebarre']));
$nb_codebarre = count($codebarre);
// On décompose la date du jour (date du jour est une variable défini dans un fichier de configuration)
$calc_purge_lots = explode("-",$date_jour);
$annee_purge = $calc_purge_lots[0];
$mois_purge = $calc_purge_lots[1];
$jour_purge = $calc_purge_lots[2];
// Calcul de la date de purge des lots non mis en carton
$date_purge_lots = date("Y-m-d", mktime(0, 0, 0, $mois_purge, $jour_purge+10, $annee_purge));
// On boucle sur tout les codes barre
for($i=0;$i<$nb_codebarre;$i++) {
// On vérifie que le code barre n'est pas vide
if ($codebarre[$i] != "") {
// Colcul de la longueur de chaine de code barre et nettoyage des espaces en début et fin de chaine
$longueur_codebarre = strlen(trim($codebarre[$i]));
// Gestion du code barre sur la longueur en fonction du n° de lot sur 1 ou 2 ou 3 caractères, on ajoute les 0
// De cette manière peu importe la longueur initiale, on récupére le quantième toujours au même position
if ($longueur_codebarre == 17) {
// On ajoute 2 zéro à num_lot
$codebarre[$i] = substr_replace($codebarre[$i],"00",9,0);
} else if ($longueur_codebarre == 18) {
// On ajoute 1 zéro à num_lot
$codebarre[$i] = substr_replace($codebarre[$i],"0",9,0);
} else {
$codebarre[$i] = $codebarre[$i];
}
// Extrait du quantieme (jour dans l'année) à partir du code barre
$quantieme_codebarre = substr($codebarre[$i],12,3);
// Colcul de la longueur de chaine de code barre suivant et nettoyage des espaces en début et fin de chaine
$longueur_codebarre_suivant = strlen(trim($codebarre[$i+1]));
// Gestion du code barre sur la longueur en fonction du n° de lot sur 1 ou 2 ou 3 caractères, on ajoute les 0
// De cette manière peu importe la longueur initiale, on récupére le quantième toujours au même position
if ($longueur_codebarre_suivant == 17) {
// On ajoute 2 zéro à num_lot
$codebarre[$i+1] = substr_replace($codebarre[$i+1],"00",9,0);
} else if ($longueur_codebarre_suivant == 18) {
// On ajoute 1 zéro à num_lot
$codebarre[$i+1] = substr_replace($codebarre[$i+1],"0",9,0);
} else {
$codebarre[$i+1] = $codebarre[$i+1];
}
// Extrait du quantieme (jour dans l'année) à partir du code barre suivant
$quantieme_codebarre_suivant = substr(($codebarre[$i+1]),12,3);
// Extrait de l'année à partir du code barre
$annee_codebarre = substr($codebarre[$i],15,4);
// Nettoyage des espaces
$codebarre_propre = preg_replace('/\s{1,}/','', $codebarre[$i]);
// On vérifie que le lot est bien présent en base avant de faire un update (num_liaison est défini en index dans la table). Pour info, la table contient plus de 650 000 enregistrement format MyIsam.
$query_verif_lot = "select num_liaison from etj420 where (num_liaison = '$codebarre_propre')";
$result_verif_lot = mysql_query($query_verif_lot) or die ('Erreur dans la requête : ' . $query_verif_lot . '<br>Avec l\'erreur : ' . mysql_error());
$nb_verif_lot = mysql_numrows($result_verif_lot);
// Le lot est bien présent
if ($nb_verif_lot > 0) {
// On vérifie qu'on a pas déjà mis le lot en carton
$query_verif_carton = "select num_liaison, code_site, num_carton from etj420 where (num_liaison = '$codebarre_propre' and code_site = '$_SESSION[codesite]' and num_carton != '0')";
$result_verif_carton = mysql_query($query_verif_carton) or die ('Erreur dans la requête : ' . $query_verif_carton . '<br>Avec l\'erreur : ' . mysql_error());
$nb_verif_carton = mysql_numrows($result_verif_carton);
if ($nb_verif_carton == 0) {
//On met à jour la table archive pour le n° de carton et le n° de travé en fonction du numliaison
$query_maj_archive = "update etj420 set num_carton = '$num_carton', code_site = '$_SESSION[codesite]' where num_liaison = '$codebarre_propre'";
$result_maj_archive = mysql_query($query_maj_archive) or die ('Erreur dans la requête : ' . $query_maj_archive . '<br>Avec l\'erreur : ' . mysql_error());
} else {
$lots_deja_encarton .= $codebarre_propre." ";
}
}
// Le lot n'est pas présent, on stocke son n°
else {
// Nettoyage des espaces
$lots_non_present .= $codebarre_propre." ";
}
// On compare les 2 quantiemes, si ils sont différents, il faudra mettre à jour également la date de mise en carton et date d'épuration pour les 2 quantiemes
if ($quantieme_codebarre != $quantieme_codebarre_suivant) {
// On met à jour la table avec la date de mise en carton + la date d'épuration pour le quantieme du site
$query_maj_carton = "update etj420 set date_mise_encarton='$date_jour', date_purge_lots='$date_purge_lots' where (quantieme ='$quantieme_codebarre' and annee='$annee_codebarre' and code_site='$_SESSION[codesite]')";
$result_maj_carton = mysql_query($query_maj_carton) or die ('Erreur dans la requête : ' . $query_maj_carton . '<br>Avec l\'erreur : ' . mysql_error());
} else {
// On met à jour la table avec la date de mise en carton + la date d'épuration pour le quantieme suivant du site
$query_maj_carton = "update etj420 set date_mise_encarton='$date_jour', date_purge_lots='$date_purge_lots' where (quantieme ='$quantieme_codebarre_suivant' and annee='$annee_codebarre' and code_site='$_SESSION[codesite]')";
$result_maj_carton = mysql_query($query_maj_carton) or die ('Erreur dans la requête : ' . $query_maj_carton . '<br>Avec l\'erreur : ' . mysql_error());
}
} // Fin du IF si le code barre n'est pas vide
} // Fin du FOR
?>
En relisant mon code, c'est sûr il y a des choses à améliorer mais je bloque, comment améliorer le traitement pour qu'il soit plus rapide ?Merci pour vos retours et désolé si mon code n'est pas des meilleurs mais je fais de mon mieux !
@+ tard