2010-02-02 127 views
1

我有开发eblast应用PHP:发送邮件的原因超时

程序是用来发送电子邮件的一些收件人

收件人的电子邮件将是一个xls文件

和抢程序设定它每次发送10封电子邮件并睡眠30秒

并使用ob_flush();和flush();到了把处理和显示的蒸汽前端

昨日9000个收件人我的客户测试(应采取以防万一10小时)

,他告诉我的计划已经停止,而且我发现日志文件有标记,该计划已经停止在65XX电子邮件,

意味着该方案已派出6XXX电子邮件(以防万一7小时)

,绝不会在cron作业发生这个问题,但只是发生在EXEC虽然网络浏览器

我的FRD告诉我,因为这是关于长时间的睡眠?

,他建议使用cron作业,但我的应用程序已经有cron作业设置,

客户只想有一个特点,立即发送

电子邮件中的任何其他方案来解决?使用PHP调用一个Linux命令并请求一个PHP电子邮件发送脚本?

回答

0

在Apache或IIS中长时间运行的进程很棘手。问题是,如果发生任何事情就像重新启动Web服务器或超时你失去了你的工作。你最好保持简单并做成一份定期工作,但如果你能应付挑战,就有可能解决问题。

我已经绕过了偶尔的web服务器重新启动,通过将我的进程状态保存到数据库和一个脚本不断地点击页面来检查它是否正常运行。所以当长时间运行的进程首次加载时,它会检查它是否应该运行,以及它是否应该继续工作。在你的情况下,这可能是Excel文件的行号。

它结束了很多额外的工作,你需要非常小心。从你项目的声音中,我会通过你提到的cron工作路线来保持简单。

+1

假设我没有针对服务器重启 的情况下,我已经保存在我的节目 我发现,会是一个解决方案的每个循环在DB进程状态使用ignore_user_abort(真)时?在你的暗示中,你的意思是什么?“一个脚本不断地点击页面来检查它是否正常运行”,这将是一个客户端脚本?或cronjob检查? 我已经有意误导我的客户,并告诉他,因为他的浏览器资源的缺乏,所以porgram停止,尝试使用cronjob,哈哈哈 但我仍想找出解决方案 – user192344 2010-02-02 07:05:57

0

我的解决方案是,尝试设置您的cronjob每分钟运行。 但是,您应该保存您的cronjob的状态,以便它不会运行两次。

我通常做这种方式(请注意,这cron是旨在为每分钟运行):现在

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); 
    } 
} 

,您的cronjob,只需装入XLS,运行它,并写日志要么数据库/文件。 然后在面板上阅读该日志并显示它,以便您的客户现在可以看到,发送了xxx电子邮件并发送了xxx电子邮件。