2010-02-02 4 views
1

j'ai développer une application eblastPHP: envoyer délai d'attente de cause email

Le programme est utilisé pour envoyer un courrier électronique à certains destinataires

l'e-mail du destinataire sera grab à partir d'un fichier xls

et la programme a mis à envoyer 10 email chaque fois et dors 30 secondes

et d'utiliser ob_flush(); et rinçage(); à savoir mettre la vapeur du processus et l'affichage dans frontend

hier mon test client avec 9000 bénéficiaires (il devrait prendre arround 10 heures)

et il m'a dit que le programme a arrêter, et je trouve le fichier journal a marque que le programme est arrêté à 65XX emails,

qui signifie que le programme a déjà envoyé 6XXX email (arround 7 heures)

et ce problème ne se produira jamais dans l'emploi cron, mais seulement se produire lorsque exec que le web navigateur

mon frd m'a dit parce qu'il s'agit de dormir longtemps?

et il suggère d'utiliser l'emploi Cron, mais ma demande a déjà tâche cron pour définir,

le client veulent juste avoir une fonction pour envoyer l'e-mail immédiatement

toute autre solution pour résoudre? utiliser php appeler une commande linux et excu un script d'envoi de php?

Répondre

0

Les processus longs d'Apache ou d'IIS sont complexes. Le problème est que si quelque chose se passe comme un redémarrage du serveur web ou un timeout vous perdez votre travail. Vous feriez mieux de rester simple et faire un travail cron, mais si vous êtes prêt à relever le défi, il est possible de se déplacer.

J'ai fait le tour des redémarrages occasionnels du serveur web en sauvegardant l'état de mon processus dans une base de données et un script qui frappe continuellement la page pour vérifier si elle fonctionne bien. Ainsi, lorsque le processus de longue durée est chargé, il vérifie s'il doit être en cours d'exécution et s'il doit continuer ou non. Dans votre cas, cela pourrait être le numéro de ligne du fichier Excel. Il finit par être beaucoup de travail supplémentaire et vous devez faire très attention. D'après les sons de votre projet, je resterais simple en allant sur la route de travail cron que vous avez mentionné.

+1

suppose que je n'avez pas le cas pour le serveur redémarrage et je l'ai déjà sauvegarder l'état du processus db sur chaque boucle de mon programme je trouve que ce que ce sera une solution quand ignore_user_abort en utilisant (true)? im not sur dans votre suggestion, que voulez-vous dire par "un script qui frappe continuellement sur la page pour vérifier s'il fonctionne et fonctionne", ce sera un script côté client? ou un cronjob à vérifier? J'ai déjà dans le but d'induire en erreur mon client, et lui dire parce que le manque de la ressource de son navigateur, de sorte que le pogrom arrêter, essayez d'utiliser cronjob, mais je veux toujours trouver la solution – user192344

0

Ma solution est, essayez de configurer votre cronjob à exécuter toutes les minutes. Cependant, vous devriez sauvegarder l'état de votre cronjob afin qu'il ne soit pas exécuté deux fois.

je le fais habituellement de cette façon (Notez que ce Cron est destiné à exécuter toutes les minutes):

if(stat_check_file('cron.stat')) 
{ 
    die("Found CRON.STAT, Exit!"); 
} 
else 
{ 
    stat_create_stat_file('cron.stat'); 
    //do your long process here... 
} 
stat_delete_stat_file('cron.stat'); 

function stat_check_file($filename) 
{ 
    global $rootdir; 

    return file_exists($rootdir.'/'.$filename); 
} 

function stat_create_stat_file($filename){ 
    global $rootdir; 

    touch($rootdir.'/'.$filename); 
} 

function stat_delete_stat_file($filename) 
{ 
    global $rootdir; 

    if(stat_check_file($filename)) 
    { 
     @unlink($rootdir.'/'.$filename); 
    } 
} 

Maintenant, sur votre cronjob, il suffit de charger le xls, exécutez et log, soit la base de données/fichier. puis, sur votre panneau, lisez ce journal et affichez-le pour que votre client puisse le voir maintenant, il y a xxx email envoyé et xxx email pour aller.