IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimisation script PHP et Mysql [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Invité
    Invité(e)
    Par défaut Optimisation script PHP et Mysql
    Bonjour,
    Désolé si je ne suis pas dans le bon forum, mais cela concerne aussi bien php que Mysql.
    Mon pb est le suivant : j'ai un script qui va chercher dans ma db des adresses mails. Ensuite via le webservice de mon routeur de mail de masse, je récupère le statut du mail en question (spam, adresse inexistante, ...) et met à jour cette valeur dans ma db.
    J'ai remarqué que pour environ 1500 adresses mails, le temps d'exécution était bien trop long pour si peux d'adresse et que dernièrement je suis même tombé en time out (erreur 504).
    Voici mon script et dite moi comment l'optimiser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    //--- recherche des groupes de contacts ayant envoyé une campagne a J-1
    $sql = 'SELECT newsletter.id_groupe, newsletter_groupe.libelle, newsletter_client.societe 
    	FROM newsletter 
    	LEFT JOIN newsletter_groupe ON newsletter_groupe.id_groupe = newsletter.id_groupe 
    	LEFT JOIN newsletter_client ON newsletter_client.id_client = newsletter.id_client 
    	WHERE TO_DAYS(NOW()) - TO_DAYS(newsletter.post_date) <= 1 
    	GROUP BY newsletter.id_groupe' ; 
     
    $query = mysql_query($sql) or die (mysql_error());
    $nbgroupe = mysql_num_rows($query);
     
    if($nbgroupe >= 1)
    {
    	//--- boucle sur les groupes retournés
    	while ($groupe = mysql_fetch_assoc($query))
    	{
    		$i = 0;
    		//--- recherche des abonnés
    		$sqlabo = 'SELECT newsletter_abonne.id_abonne, newsletter_abonne.cle, newsletter_abonne.mail, newsletter_abonne.etat 
    			FROM newsletter_abonne 
    			WHERE newsletter_abonne.id_groupe = ' . $groupe['id_groupe'] . ' ' ;
    		$queryabo = mysql_query($sqlabo) or die (mysql_error());
    		//--- boucle sur les abonnées du groupe
    		while ($abo = mysql_fetch_assoc($queryabo))
    		{
    			$i++;
    			$statut = Newsletter::MJStatutMailAbo($abo['mail']);
    			if($statut['unsub'] == 1) { $etat = 2 ; }
    			elseif($statut['bounce'] >= 1 && $statut['blocked'] == 0 && $statut['spam'] == 0 && $statut['unsub'] == 0) { $etat = 3 ; }
    			elseif($statut['blocked'] >= 1) { $etat = 4 ; }
    			elseif($statut['spam'] >= 1) { $etat = 5 ; }
     
    			//--- pour réduire le nb de requête la MAJ se fait uniquement si l'état est différent de la valeur en DB.
    			if($etat != $abo['etat'])
    			{
    				//--- Met à jour l'état d'un destinataire
    				$sql = 'UPDATE newsletter_abonne
    					SET newsletter_abonne.etat = '.$etat.', newsletter_abonne.derniere_modification = Now() 
    					WHERE newsletter_abonne.mail = \'' . $abo['mail'] . '\' 
    					AND newsletter_abonne.id_groupe = ' . $groupe['id_groupe'] . '' ;
    				$Result = mysql_query($sql) or die(mysql_error()) ;
    			}
    		}
    		$html.='Mise à jour de ' . $i . ' statut'.($i >=2 ? 's' : '').' d\'abonné pour le groupe "' . stripslashes($groupe['libelle']) . '" du client ' . stripslashes($groupe['societe']) . '<br />' ;
    	}
    	return $html;
    }
    D'avance merci pour vos retours
    Dernière modification par Bovino ; 20/06/2013 à 08h29. Motif: Réduction de l'indentation : merci pour ceux qui lisent...

  2. #2
    Membre actif
    Profil pro
    Responsable de service informatique
    Inscrit en
    Août 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 174
    Points : 232
    Points
    232
    Par défaut
    Bonjour,

    Pas facile à voir.

    Il faudrait connaitre la structure de ta base de données, ton environnement.

    Ton webservice répond bien ?

    N'est-il pas possible de commencer par traiter l'état des abonnés avant les groupes ?

    Natso.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le ws répond super bien, les champs des tables sont bien indexés.
    Cela ne viendrait il pas du fait qu'il s'agit d'un Mutu ovh ?
    Car en l'état de mes connaissances je ne sais pas quoi améliorer de plus.

    Il est préférable de traiter les abonnés liés aux groupes utiliser, car sinon il y aurait beaucoup plus de mise à jour et cela ferra le contraire de se que je souhaite faire.

  4. #4
    Membre actif
    Profil pro
    Responsable de service informatique
    Inscrit en
    Août 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 174
    Points : 232
    Points
    232
    Par défaut
    Désolé je ne connais pas le réseau OVH.

    Il faudrait peut être modifier la structure des tables.
    Ajouter des flags lors de certains traitement ou autres afin de limiter ces adresses.

    Pour 1500 adresses cela devrait théoriquement être assez rapide mais quid du réseau ovh ?

    Ce ne sont que des suppositions, je ne peux t'aider plus.

    Natso

  5. #5
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Ce que je sais du réseau OVH, c'est que si le taux d'échec de réception des mails envoyés par un programme est supérieur à tant (5% ou 7%, je ne sais plus), ils te bloquent en tant que spammeur.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  6. #6
    Invité
    Invité(e)
    Par défaut
    En l’occurrence je n'utilise pas ovh pour envoyer mes campagnes mail.
    Et elles sont faites dans les règles pour justement ne pas être spammé.

    Que veux tu dire par flag ?

  7. #7
    Membre actif
    Profil pro
    Responsable de service informatique
    Inscrit en
    Août 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 174
    Points : 232
    Points
    232
    Par défaut
    Bonjour,

    Désolé, boulot oblige.

    J'ai relu ton premier post.

    Je ne connais pas ton environnement réseau mais les serveurs de mails mettent en file d'attente les emails qu'ils n'ont pu traiter la première fois et les relancent toutes les heures par exemple pendant x heures ou jours.

    De plus, lors de la première réception,certains serveurs anti spam attendent une réponse du serveur d'envoi, ceci pour bloquer les robots d'envoi.

    Tu as deux fois la variable sql déclarée. Bon ce n'est pas ça qui va régler le problème. Tu as essayé de mettre ton update en commentaire et de voir le temps de traitement ?

    J'ai trouvé ça chez ovh:http://forum.ovh.com/showthread.php?t=83804
    concernant la fonction now que tu utilises.

    Natso

  8. #8
    Invité
    Invité(e)
    Par défaut
    Avant de cloturer le sujet, j'ai changé de méthode au niveau de l'api est cela est plus performant.
    Merci pour l"info sur le pb de NOW() dans les requêtes je vais voir si cela me concerne.
    Pour finir, le script d'envoi aucun mails, il met seulement à jour des infos dans ma db à J+1.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL-Server] Optimisation Script PHP
    Par JmL40 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 06/05/2014, 18h40
  2. [PostgreSQL] Convertion de Script PHP utilisant Mysql vers Postgresql
    Par Boy_From_HelL dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/08/2013, 01h52
  3. [PHP 5.4] Optimisation script php
    Par Mardewin dans le forum Langage
    Réponses: 6
    Dernier message: 10/05/2013, 11h35
  4. adapter un script php avec mysql pour firebird
    Par omar24 dans le forum Firebird
    Réponses: 1
    Dernier message: 04/03/2011, 13h48
  5. [MySQL] Exécuter un script PHP depuis MySQL
    Par phicarre dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/08/2009, 23h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo