通过cPanel电子邮件用户筛选成功地将电子邮件发送到PHP脚本中,但是PHP脚本有一个执行时间限制(以防止DoS)。当时间限制错误发生时,电子邮件会弹出。
尽管这是一个PHP错误正在产生的反弹,这个错误实际上不能被修正,这就是为什么有一个时间限制。
反弹消息的示例如下:
此邮件是由邮件传递软件自动创建的。 无法将您发送的邮件传递给一个或多个收件人。这是一个永久的错误。以下地址(Es)失败: -q /home/foo/bar/script.php 由moo@beer.cl生成 本地传递失败--这是消息的副本,包括所有的标头。 -.
第一件事可能会想到,执行时间限制错误是打印一条消息(这会自动导致反弹),但事实并非如此,因为ini_set('display_errors', false);是设置的。没有打印任何内容的证据是缺乏:“在传递过程中生成了以下文本:.”在上面引用的信息中。
小小的考验:
#!/usr/bin/php -q
<?php
set_time_limit(1);
ini_set('display_errors', false);
$fh_stdin = fopen('php://stdin', 'rb');
while (true) rand();
?>发布于 2015-09-28 05:20:49
不确定这里是否有问题,但是邮件处理程序会弹出消息,因为当PHP脚本由于错误而异常终止时,PHP进程将向shell返回一个非零值(在本例中为255)。
当您的MTA通过管道将电子邮件发送到您的脚本时,由于它的返回值大于0,它会看到它失败了,它认为它是一个失败,并弹出消息(可能包括反弹消息中的任何脚本输出)。
如果不能(或不希望)更改这些管道进程的最大执行时间,一种解决方案是将消息排队,由其他脚本处理,在该脚本中,可以将处理分解为各个部分或增加时间限制。
使用register_shutdown_function()和set_error_handler(),我无法用exit(0)覆盖PHP的返回值,因此这可能不是一个解决办法。
您应该能够增加使用set_time_limit的时间,除非您的PHP在安全模式下运行,否则它不会这样做。但是,如果进程真正长时间运行,则最好将消息排队处理,而不是在消息传入时尝试处理,因为这可能会导致瓶颈或服务器重载。
https://stackoverflow.com/questions/32791205
复制相似问题