Fatal error: Maximum execution time of 30 seconds exceeded

Eléphant du PHP | 453 Messages

04 nov. 2009, 01:32

Bonsoir tout le monde,

Habituellement, je m'en sors pas trop mal, mais là, j'ai besoin de votre expérience. Je suis entrain de me faire un petit système en local d'e-mailing que je compte encore améliorer bien sûr. Quand j'envoie 3 courriels, le script se déroule pas trop mal (enfin, j'ai le sablier de la souris qui s'énerve un peu trop). Par contre, quand j'envoie plus de 4/5 courriels, j'ai le message :
Fatal error : Maximum execution time of 30 seconds exceeded ...


Je sais qu'il existe la commande :
ini_set("max_execution_time",0); //temps infini d'exécution
Je souhaiterai que vous supervisiez mon script et me dire si je n'ai pas commis de grossières erreurs.
config_mailing.php :
<?php
error_reporting(E_ALL ^ E_NOTICE);
setlocale(LC_TIME, "french", "fr_FR");

define("REP_SOURCES","sources/");
define("REP_LIBRAIRIES","librairies/");
define("REP_LANGUAGE","language/");

define("GABARIT","gabarit_courriel.html"); // xhtml 1.0 transitional - iso8859-1- css interne - mise en page old and bad school
define("ALT_GABARIT","lettre_alternative.txt");
define ("LANGUE","fr");
define("SMTP_FAI","smtp.fai.ext");
define("EXPEDITEUR_NS","prenom nom");
define("EXPEDITEUR","[email protected]");
define("DESTINATAIRES","test.csv"); 

function __autoload($class){
    require_once REP_SOURCES.REP_LIBRAIRIES."class.".$class.".php"; 
}
?>
envoi.php
<?php
require_once "config_mailing.php";

try{
    //initialisation
    $dateEnvoi = strftime("%d %B %Y");
    $gabarit = file_get_contents(REP_SOURCES.GABARIT);
    $texteAlternatif = file_get_contents(REP_SOURCES.ALT_GABARIT);
    $sujet = "Un sujet de courriel";
    
    //récupération de la liste des destinataires
    //(array à deux dimensions et clefs associatives au deuxième niveau)
    $listeAssociations = new csvReader(REP_SOURCES.DESTINATAIRES);
    $destinataires = $listeAssociations->getDonnees();
    
    $emailing = new PHPmailer();
    $cheminLangage = REP_SOURCES.REP_LIBRAIRIES.REP_LANGUAGE;
    
    //config envoi
    $emailing->IsSMTP();
    $emailing->IsHTML(true);
    $emailing->Host = SMTP_FAI;
    $emailing->SetLanguage("fr",$cheminLangage);
    
    $emailing->SMTPAuth = false;
    $emailing->SMTPKeepAlive = true;
    
    $emailing->FromName = EXPEDITEUR_NS;
    $emailing->From = EXPEDITEUR;
    
    
    //parcour la liste
    $enregistrement = 1;
    foreach($destinataires as $elements){
        // regroupe les divers éléments du courriel et
        // réinitialise le tout pour le prochain enregistrement (!)
        $courriel = array($sujet, $gabarit, $texteAlternatif);
        
        foreach($elements as $attribut => $valeur){
            $search = "__".strtoupper($attribut)."__";
            
            //remplace mot clef
            $courriel = str_replace($search,trim($valeur),$courriel);
            
            //ajout de la date en Français
            $courriel = str_replace("__DATE__",$dateEnvoi,$courriel);
            
            //détermination des coordonnées
            switch($attribut){
                case "courriel" :
                    $courrielDestinataire = trim($valeur);
                    break;
                case "prenom" :
                    $prenomDestinataire = trim($valeur);
                    break;
                case "nom" :
                    $nomDestinataire = trim($valeur);                    
                    break;                    
            }
            $destinataireNS = $prenomDestinataire." ".$nomDestinataire;
        }
        //rend invisible les mots clefs dans le cas où
        //un enregistrement n'aurait pas de concordance (!)
        $pattern = "#\b[_]{2}[A-Z]{2,}[_]{2}\b#";
        $courriel = preg_replace($pattern,"",$courriel);
        
        $emailing->Subject = $courriel[0];
        $emailing->Body = $courriel[1];
        $emailing->AltBody = $courriel[2];
        
        if(empty($courrielDestinataire))
            throw new Exception("impossible de récupérer le courriel d'un destinataire.");
        
        $emailing->AddAddress($courrielDestinataire,$destinataireNS);
         
        if(!$emailing->Send()){ 
            throw new Exception("envoi impossible");
        }else{
            $resultatEnvoi[] = "<strong>".stftime("%d %B %Y %H:%M:%S")." :</strong><br />";
            $resultatEnvoi[] = $enregistrement." : courriel envoyé à ".$destinataireNS." (".$courrielDestinataire.")<hr />";

            $enregistrement++;
        }
        //supprime tout information pour le prochain envoi
        $emailing->ClearAddresses();
        
    }
    
    echo $courriel[1];
    echo implode("<br />",$resultatEnvoi);
    
    //destruction de l'objet
    unset($emailing);
}catch(Exception $e){
    echo $e->getMessage();
}
?>
Mes questions sont :
Quel est l'avantage et l'inconvénient d'un temps limité et illimité ?
Y'a t'il un rapport avec la gestion de la mémoire ?
C'est mon premier emailing. Je ne connais pas vraiment le comportement d'une machine. Comme je l'ai dit précédemment, j'ai le sablier qui titille. Est ce normal ? J'ai pensé à faire un système qui endormirait le script. J'ai pensé à sleep(). Avec cette fonction, j'ai quand même le « Fatal error: Maximum execution time »

Je sais qu'on a pas l'assurance que le destinataire ait le courriel. J'ai pensé à inclure dans le fichier csv, un mail à mon attention toutes les n fois. Il y a t'il des petites astuces supplémentaires ?

Je vous remercie par avance de m'accorder un peu de votre temps pour mon petit soucis.

Bon code :)
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 nov. 2009, 12:29

Essaie une recherche sur le forum, cette problématique a déjà été soulevée et a obtenu plusieurs réponses qui pourront t'aider.

Eléphant du PHP | 453 Messages

04 nov. 2009, 20:30

Hello,
Je sais qu'on a pas l'assurance que le destinataire ait le courriel. J'ai pensé à inclure dans le fichier csv, un mail à mon attention toutes les n fois. Il y a t'il des petites astuces supplémentaires ?
Non, ça répond pas trop à mes questions.

Par contre, j'ai bien avancé. J'ai augmenté le time limit. J'ai un meilleur comportement. J'ai pensé à faire un système de pagination dynamique et accès automatique (envoi de courriel/ paquet).
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

ViPHP
ViPHP | 4674 Messages

05 nov. 2009, 11:02

Hey :-),

Si, tu peux t'assurer que le mail a bien été envoyé. Le protocole SMTP te retoune un beau code (je ne sais plus lequel) si tu n'as pas eu d'erreur. S'il n'y a pas d'erreur, c'est que le mail est envoyé. Après, il est envoyé sur le serveur hein. Ça peut déconner au moment de la réception du mail, mais tu n'es plus responsable à partir de ce moment là ;-).
Ou sinon, de bêtes accusés-réceptions traités par un robot, c'est aussi une solution envisageable.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 453 Messages

05 nov. 2009, 16:00

Hello Hywan,

Merci de ta réponse encourageante. Je vais faire des petites recherches à propos du message du SMTP. J'ai vu que je peux avoir le résultat du SMTP.
[...] Ou sinon, de bêtes accusés-réceptions traités par un robot, c'est aussi une solution envisageable.
Arf, je crois avoir lu une fois que ce n'était pas possible. Là, je viens de vérifier et j'ai juste à donner une valeur à une propriété et le tour est joué.

Sujet résolu pour ma part et merci encore.

Bon code à toi. :)
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia