【问题标题】:PHP: send email cause timeoutPHP:发送电子邮件导致超时
【发布时间】:2010-02-02 02:54:40
【问题描述】:

我已经开发了一个 eblast 应用程序

该程序用于向某些收件人发送电子邮件

收件人的电子邮件将从 xls 文件中获取

并且程序已将其设置为每次发送 10 封电子邮件并休眠 30 秒

并使用 ob_flush();和冲洗();将进程的蒸汽输出并显示在前端

昨天我的客户测试了 9000 个收件人(大约需要 10 小时)

他告诉我程序已经停止,我发现日志文件有标记程序已停止在 65XX 电子邮件,

这意味着程序已经发送了 6XXX 封电子邮件(大约 7 小时)

这个问题永远不会发生在cron作业中,而只会在通过网络浏览器执行时发生

我的朋友告诉我,因为这完全是关于长时间睡眠?

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

客户只是想拥有一个立即发送电子邮件的功能

还有其他解决方案吗?使用php调用linux命令并执行php电子邮件发送脚本?

【问题讨论】:

    标签: php


    【解决方案1】:

    Apache 或 IIS 中长时间运行的进程很棘手。问题是如果发生任何事情,例如重新启动网络服务器或超时,您将失去工作。你最好保持这个简单并成为一个 cron 工作,但如果你准备好迎接挑战,就有可能绕过。

    我通过将我的进程状态保存到数据库和一个不断点击页面以检查它是否正常工作的脚本来解决偶尔的网络服务器重启问题。因此,当长时间运行的进程首次加载时,它会检查它是否应该运行以及是否应该继续工作。在您的情况下,这可能是 excel 文件的行号。

    这最终会带来很多额外的工作,您需要非常小心。从你的项目的声音来看,我会通过你提到的 cron 工作路线来保持简单。

    【讨论】:

    • 假设我没有重启服务器的情况,并且我已经在程序的每个循环中将进程状态保存在 db 中,我发现使用 ignore_user_abort(true) 时这将是一个解决方案吗?我不是在你的建议中,你是什么意思“一个不断点击页面以检查它是否正常工作的脚本”,它将是一个客户端脚本?还是要检查的cronjob?我已经故意误导我的客户,告诉他因为他的浏览器资源不足,所以porgram停止,尝试使用cronjob,哈哈哈但我还是想找出解决办法
    【解决方案2】:

    我的解决方案是,尝试将您的 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 封电子邮件要发送。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-26
      • 2015-11-25
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2011-09-16
      • 2012-02-04
      相关资源
      最近更新 更多