首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个函数调用是否重置max_execution时间?

每个函数调用是否重置max_execution时间?
EN

Stack Overflow用户
提问于 2020-04-02 08:04:42
回答 1查看 432关注 0票数 2

我今天遇到了这个问题。我正在编写一个函数来运行cron作业,生成订单的pdf,将其保存在数据库中,并将邮件作为附件发送。我从数据库中获取所有订单,并在一个循环中运行它,为每个订单生成、存储和发送邮件。该作业在本地很好,可能是因为数据较少,但是在部署之后,我们得到了30秒的max_execution_time超过错误。错误指向库中的一个文件,我们正在使用它生成pdf(fpdf)。由于无法在现场获取数据进行测试,所以我在循环中运行了pdf生成函数。作为,

代码语言:javascript
复制
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超过了错误。为了测试,我调用函数从循环中发送电子邮件,如

代码语言:javascript
复制
             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分钟,显示的执行时间超过了错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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脚本可以读取这些任务并执行它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60986861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档