PHP命令行脚本在false上退出

PHP命令行脚本在false上退出,php,command-line,phpmailer,Php,Command Line,Phpmailer,我在PHP命令行中运行一个循环脚本,它使用PHPMailer向客户发送电子邮件。我收到的问题是,当PHPMailer返回false时,命令行脚本退出 以下是脚本伪代码: while(the loop is valid){ if(mail ID exists){ set_time_limit(30); ..compose mail.. if($mail->Send()){ ..Mark as success in

我在PHP命令行中运行一个循环脚本,它使用PHPMailer向客户发送电子邮件。我收到的问题是,当PHPMailer返回false时,命令行脚本退出

以下是脚本伪代码:

while(the loop is valid){
    if(mail ID exists){
        set_time_limit(30);
        ..compose mail..
        if($mail->Send()){
            ..Mark as success in database..
            usleep(10000);
        } else {
            ..Mark as failure in database..
            usleep(10000);
        }
    }
    ..continue loop..
}
如果
$mail->Send()
返回false,脚本将停止并退出。这是PHP在命令行中的预期行为吗?如果是这样的话,有没有办法告诉PHP在收到错误消息时不要停止


谢谢您的帮助。

我猜
$mail->Send()
函数(或完全其他的函数)抛出了一个错误,导致脚本停止执行

我想数据库中的值也没有更新?如果是这样的话,情况就是这样。在启用错误报告的情况下运行脚本以确定这一点

error_reporting(E_ALL);
ini_set('display_errors', true);

最有可能的是错误处理例程(在else分支中)调用
exit
,或者导致一个致命错误,让php退出。
添加两行调试输出,以检查脚本是否进入和离开else分支(成功)


您确定send()是退出的原因吗?这也可能是脚本超时或while循环条件下的错误。我的测试表明,脚本只有在遇到循环的失败部分时才会退出。您是否使用error\u reporting=E\u ALL和display\u errors=true运行脚本(或关注error.log)?是的,我正在跟踪error.log,但那里没有什么重要的东西。因此,我的问题是,如果命令行脚本遇到错误,它是否会退出。这有点奇怪,因为我们几乎在任何地方都使用布尔结果,对吗?不,php cli不会因为某些任意函数/方法返回false而退出。是的!数据库中的值未更新。我在错误报告打开的情况下运行,但没有返回任何提示。PHPMailer的手册上说:
Send()
创建消息并分配邮件。如果消息未成功发送,则返回false。使用ErrorInfo变量查看错误描述。成功时返回true,失败时返回false。PHPMailer可能试图使用
@
抑制器来阻止失败,但如果这是致命错误,它将无论如何退出。我使用PHP5.3并在论坛中阅读了这篇文章:
PHPMailer使用了PHP5.3版中不推荐使用的功能。如果在php.ini配置文件中启用了不推荐使用的消息(一种新类型的警告),这将导致E_不推荐使用的消息。
这会触发退出吗?不推荐使用的消息是否会阻止脚本?感谢您的帮助。正如@VolkerK所说,E_不推荐的消息是警告,不会停止脚本的执行。在其他地方,可能甚至在PHPMailer中也会出现一个错误,即停止执行。否。脚本甚至没有进入失败例程。它只是退出。我试着在浏览器上运行相同的脚本,结果成功了!如果为false,它将处理失败例程并继续循环。我在浏览器中调用页面时遇到的问题是,无论我们在php.ini中指定了什么,IIS都会在指定的超时后停止任何快速CGI。因此,不可能发送整个电子邮件列表。您可以使用xdebug和netbeans之类的调试器作为前端来逐步完成代码。
while(the loop is valid){
     [...]
        } else {
          error_log('Debug: Send() failed. Start error handling');
          ..Mark as failure in database..
          usleep(10000);
          error_log('Debug: Send() failed. End error handling');
        }
     [...]