2012-07-23 4 views
2

Dites que mon set_time_limit est défini sur 30 secondes et ne peut pas être modifié. J'ai un script email en php qui va durer plus de 30 secondes sur un job de 1 cron (je n'ai pas encore atteint ce point de temps). Que se passe-t-il sur le timeout après 30 secondes? Le script va-t-il s'arrêter puis continuer?Enregistrer le temps écoulé en direct du script PHP

Sinon, je voudrais enregistrer le temps écoulé depuis le début de la boucle de mon script jusqu'à ce qu'il atteigne 30 secondes et mettre en pause le processus puis continuer.

Quelle est une bonne façon de faire cela?

Mise à jour: ce que je pense pourrait fonctionner

function email() 
{ 
    sleep(2); //delays script 2 seconds (time to break script on reset) 

    foreach ($emails as $email): 
     // send individual emails with different content 
     // takes longer than 30 seconds 
    enforeach; 

    // on 28 seconds 
    return email(); //restarts process 
} 
+0

Quelles sont les choses que vous avez essayées? –

+3

Après 30 secondes, une erreur fatale sera émise et le script sera terminé. http://php.net/manual/fr/function.set-time-limit.php –

+0

@sixeightzero rien que je suis confiant .. pour cette raison, je demande des conseils. – CyberJunkie

Répondre

1

Approche suggérée:

function microtime_float() 
{ 
    list($usec, $sec) = explode(" ", microtime()); 
    return ((float)$usec + (float)$sec); 
} 

$time_start = microtime_float(); 
foreach ($emails as $email): 
    // send individual emails with different content 
    // takes longer than 30 seconds 

    $time_curr = microtime_float(); 
    $time = $time_curr - $time_start; 
    if($time > 28){ //if time is bigger than 28 seconds (2 seconds less - just in case) 
     break;// we will continue processing the rest of the emails - next time cron will call the script 
    } 
enforeach; 
+3

Si vous avez PHP> = 5.0, vous pouvez juste utiliser 'microtime (true)' pour récupérer comme float. –

+0

@PhpMyCoder merci pour votre commentaire. – alfasin

1

Ce que vous demandez est impossible. Lorsque le délai d'expiration du script est atteint, il s'arrête. Vous ne pouvez pas le mettre en pause et le continuer. Vous pouvez seulement le redémarrer. Laissez-moi vous dire ce que j'ai fait pour résoudre un problème similaire.

Part One: 
Queue all your emails into a simple database. (Just a few fields like to, 
from, subject, message, and a flag to track if it is sent.) 

Part Two. 
1. Start script 
2. Set a variable with the start time 
3. Check the db for any mails that have not been sent yet 
4. If you find any start a FOR loop 
5. Check if more than 20 seconds have elapsed (adjust the window here, I like 
    to allow some spare time in case a mail call takes a few seconds longer.) 
6. If too much time passed, exit the loop, go to step 10 
7. Send an email 
8. Mark this email as sent in the db 
9. The FOR loop takes us back to step 4 
10. Exit the script 

Exécutez ceci toutes les 60 secondes. Il envoie ce qu'il peut, puis le reste est envoyé la prochaine fois.

+0

merci pour la suggestion! Je pensais à une approche similaire mais sans vérifier le temps écoulé. Je ne vois pas un point si je cours le script chaque minute – CyberJunkie

+0

Le point est à cause de votre question initiale. Considérez si vous ne vérifiez pas le temps écoulé et si un e-mail est envoyé, mais le script est annulé avant que l'e-mail ne soit marqué comme envoyé. Cette personne recevra un courriel en double. Considérez également que votre hôte peut changer la valeur du délai d'expiration ou que vous utilisez le script sur un autre hôte. La vérification du temps écoulé vous laisse le contrôle et vous permet d'arrêter le script à l'avance, plutôt que de compter sur le délai d'expiration pour le terminer. – colonelclick