alerte mail

anna70
Invité n'ayant pas de compte PHPfrance

07 mars 2006, 23:29

Bonjour à tous,

je suis en train de faire une alerte mail que j'exécute avec un cron mais j'ai un petit soucis qui me turlupine .

je fais des essais sous easyphp1.8 ( fonction mail activée en local ) mais j'ai un problème de Maximum execution time of 30 seconds exceeded sachant que le script je l'essaye sur un nombre très réduit d'envoi de mail ( 4 ) et que je reçois sur les 4 des fois 2mails et des fois 1 enfin très aléatoire .

mon code le voici merci de me dire si il y'a quelque chose qui cloche ou ce qu'il faut que je fasse :

Code : Tout sélectionner

<?php require ("param.php"); $dates = date("Y-m-d"); @ $db = mysql_pconnect ("$dv_host","$dv_login","$dv_pass"); mysql_select_db("$dv_base",$db); $queryf="select pays,ville,typeannonce,id,ann from annonce where date like '$dates%'"; --> explication : la date est en datetime dans la base et j'arrête la comparaison à la date en ignorant l'heure $resultf=mysql_query($queryf); $num_results = mysql_num_rows($resultf); for ($i=0;$i<$num_results;$i++) { $row=mysql_fetch_array($resultf); $ide ="$row[id]"; $queryfa="select*from letter where pays='".$row['pays']."' and ville='".$row['ville']."' and action='".$row['typeannonce']."' and nature='".$row['ann']."'"; $resultfa=mysql_query($queryfa); $num_resultsa = mysql_num_rows($resultfa); for ($i=0;$i<$num_resultsa;$i++) { $row=mysql_fetch_array($resultfa); $adresse ="$row[mail]"; $sujet = "Alerte-mail cologimmo"; $message = "bla bla bla ..etc etc "; $headers = "From: [email protected]\r\nReply-To: [email protected]"; mail($adresse, $sujet, $message, $headers); } } mysql_close($db); ?>

anna70
Invité n'ayant pas de compte PHPfrance

08 mars 2006, 16:03

personne !!! :cry: .

juste un coup d'oeil à ce qui a plus haut pour me dire ce qui ne va pas et ce qui pourrait aller SVP [-o<

ViPHP
ViPHP | 1380 Messages

08 mars 2006, 16:11

Quelques remarques sur l'extraction de ta bdd.
@ $db = mysql_pconnect ("$dv_host","$dv_login","$dv_pass"); 
  • Eviter le @ qui n'est qu'un cache misère et rajouter un or die et l'erreur mysql éventuellement renvoyée.
  • éviter les connexions persistantes de mysql_pconnect sauf si on sait exactement pourquoi on les utilise. Lire ceci.
  • L'emploi des doubles guillemets est superflu.
  • Une connexion correcte pourrait ressembler à ceci:
    $db = mysql_connect ($dv_host, $dv_login, $dv_pass) or die(mysql_error()); 
$queryf="select pays,ville,typeannonce,id,ann from annonce where date like '$dates%'
  • éviter les opérateurs de chaîne pour les colonnes au format date/time. Préférer l' opérateur de comparaison =. Explication:

    Code : Tout sélectionner

    SELECT '2006-3-8' LIKE '2006-03-08' #--> retourne FALSE or la date est la même! SELECT DATE('2006-3-8') = '2006-03-08' #--> retourne TRUE
    Solution à ton problème de format: la fonction DATE()

    Code : Tout sélectionner

    ... WHERE DATE(`date`) = '$date'
  • le nom date est souvent un mot réservé en SQL quoique MySQL soit assez tolérant sur ce coup là. Mettre `date` ou taBase.date ou... renommer ta colonne.
  • Enfin, tu es sûr de ne pas pouvoir regrouper les deux requêtes en utilisant les jointures??
En ce qui concerne ton problème de mail. Je suppose que tu as vérifié ce que ta requête te revoie comme résultat avant de la traiter dans la boucle mail(). A ce sujet, cette fonction n'est pas idéale pour un traitement en boucle. Elle est même particulièrement inefficace car elle ouvre un socket par tour de boucle! Pour une boucle de quelques dizaines, ça peut passer mais au delà, bonjour les performances! Lui préférer la bibliothèque PEAR MAIL. Ou bien te construire toi même une petite fonction qui ouvre un seul socket et construit le flux SMTP dans une boucle. Il y a un peu de boulot mais le protocole SMTP est assez simple.
ripat

anna70
Invité n'ayant pas de compte PHPfrance

08 mars 2006, 16:35

merci ripat de t'être penché sur mon problème, je vais essayer de chercher dans le sens que tu me recommande .

anna70
Invité n'ayant pas de compte PHPfrance

08 mars 2006, 17:04

c'est bon j'ai réglé le problème en réunissant les deux requêtes en une seule ( c'est bete et simple mais il fallait y penser ) .

merci ripat de tes conseils Ô combien précieux .