我开发了一个eblast应用程序
该程序用于向某些收件人发送电子邮件
收件人电子邮件将从xls文件中获取
并且程序已将其设置为每次发送10封电子邮件并休眠30秒
并使用ob_flush();和flush();把过程的蒸汽放在前端并显示
昨天我的客户用9000个收件人测试它(它应该需要10个小时左右)
并且他告诉我程序已经停止,我发现日志文件已标记程序已停止在65XX电子邮件中,
这意味着该程序已经发送了6XXX电子邮件(arround 7hour)
并且这个问题在cron作业中永远不会发生,但只有在exec通过Web浏览器时才会发生
我的朋友告诉我,因为这是长时间的睡眠?
他建议使用cron job,但我的应用程序已经设置了cron作业,
客户只是希望有一项功能可以立即发送电子邮件
要解决的任何其他解决方案?使用php调用linux命令并执行php电子邮件发送脚本?
答案 0 :(得分:0)
Apache或IIS中长时间运行的进程非常棘手。问题是,如果发生任何事情,如重新启动网络服务器或超时,您将失去工作。你最好保持这个简单并成为一个cron工作,但如果你正在迎接挑战,那么你可以绕过它。
通过将我的进程状态保存到数据库和一个不断点击页面的脚本来检查它是否已启动并正常工作,我偶尔会重新启动Web服务器。因此,当长时间运行的进程首次加载时,它会检查它是否应该运行以及是否应该继续工作。在您的情况下,可能是excel文件的行号。
最终会有很多额外的工作,你需要非常小心。从项目的声音中我可以通过你提到的cron工作路线来保持简单。
答案 1 :(得分: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电子邮件。