PHP命令行脚本在false上退出
我在PHP命令行中运行一个循环脚本,它使用PHPMailer向客户发送电子邮件。我收到的问题是,当PHPMailer返回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
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');
}
[...]