我今天遇到了这个问题。我正在编写一个函数来运行cron作业,生成订单的pdf,将其保存在数据库中,并将邮件作为附件发送。我从数据库中获取所有订单,并在一个循环中运行它,为每个订单生成、存储和发送邮件。该作业在本地很好,可能是因为数据较少,但是在部署之后,我们得到了30秒的max_execution_time超过错误。错误指向库中的一个文件,我们正在使用它生成pdf(fpdf)。由于无法在现场获取数据进行测试,所以我在循环中运行了pdf生成函数。作为,
for ($i = 0; $i < 300; ++$i) {
$start = microtime(true);
$pdf = $page->createNewPdf();
echo $i;
echo '<br />';
echo base64_encode($pdf);
$end = microtime(true);
echo 'Diff '.($end - $start);
}这里的差异平均为0.24374079704285。在生成126个有时127个pdf文件后,我得到的max_execution_time超过了错误。为了测试,我调用函数从循环中发送电子邮件,如
for ($i = 0; $i < 200; ++$i) {
$start = microtime(true);
$pdf = $page->createNewPdf();
$page->sendMail(100, $pdf);
echo $i;
echo '<br />';
echo base64_encode($pdf);
echo '<br/>';
$end = microtime(true);
echo 'Diff '.($end - $start);
}这里的差额是6.122.重点是,我在30秒后没有得到超过max_execution_time的错误,但是在大约7到8分钟之后,我想知道为什么?,php版本是7.1.33,服务器是Aache。
如果将max_execution_time设置为30 to,则意味着向服务器发出的请求应该在30秒内发送响应,或者它是否在每次请求内调用函数时重置执行时间,createNewPdf() = 30,sendMail() =30。我仍然得到的错误大约7-8分钟。为什么?
没有sendMail()名为致命错误的错误:在第1564行的错误中,在./fpdf/tfpdf.php中超过了30秒的最大执行时间,而senMail()称为致命错误:在1564 行的./lib/fpdf/tfpdf.php中超过了30秒的最大执行时间,如何解决这个问题?,我尝试增加了execution_time,但是错误发生在时间限制之后。,但我想了解的主要问题是,为什么代码运行了7-8分钟,显示的执行时间超过了错误。
发布于 2020-04-02 11:00:46
从请求开始到结束对max_execution_time进行计数。它在调用新函数时不重置。
但是,阅读https://www.php.net/manual/en/info.configuration.php#ini.max-execution-time上的文档将告诉您
最大执行时间不受系统调用、流操作等的影响。有关详细信息,请参阅set_time_limit()函数。
因此,我想您对邮件服务的调用并不包括整个执行时间,因此您的脚本可以运行7-8分钟,最后才到达PHP运行时的限制。
因此,要避免脚本在发送电子邮件时遇到超时的问题,可以在访问max_execution_time文件时增加php.ini,或者如果您的ini_set配置允许ini_set,则可以手动增加此特定脚本的限制。
也许您甚至可以使用set_time_limit增加您的最大运行时,每次您成功地发送了一封电子邮件。
另一个更复杂但也更健壮的解决方案是实现某种电子邮件队列,然后由cli脚本通过cron进行永久处理。这样,您就不必担心超出了脚本运行时。您可以将您需要发送的邮件的所有信息放入文件或数据库表中,您的cron脚本可以读取这些任务并执行它们。
https://stackoverflow.com/questions/60986861
复制相似问题