首页 > 解决方案 > PHP 执行时间:如何使用 symfony 系统测量

问题描述

我正在尝试在 symfony 3.4 系统中使用 PHP 发送更多的电子邮件。现在脚本由于 php 时间执行限制而停止,我当然需要解决这个问题。

我的想法是将所有要发送的电子邮件放在一个表 email_queue 中,然后将它们保存在队列中后发送。

所以我正在保存所有这些电子邮件,显示一个带有进度条的页面并进行 ajax 调用,该调用应该在时间限制内发送电子邮件,报告它发送了多少(以更新进度条)以及是否有问题留在队列中,再次调用 scipt 直到发送所有内容。

到目前为止,一切都很好。现在我尝试测量 ajax 脚本部分的执行时间,以在达到 30 秒的时间限制之前停止发送。现在由于某种原因,测量值总是比 30 秒小得多,但在测量的执行时间甚至达到 2 秒之前,脚本由于达到时间限制而停止。为什么呢?这就是我进行测量的方式:

    $executionTimes = [];
    $executionPoints = [];
    $timeStart = $_SERVER['REQUEST_TIME_FLOAT'];
    foreach ($mailQueue as $mail) {

        // do some mail configuration

        // send the email

        $now = microtime(true);
        $executionTime = $now - $timeStart;
        $executionTimes[] = $executionTime;
        $executionPoints[] = $now;
        if ($executionTime >= 10) {
            break;
        }
    }
    // return data

使用$_SERVER['REQUEST_TIME_FLOAT']我想我会得到真正的执行时间,包括所有的 symfony 开销。这不正确吗?

这是一次运行的结果:

{
  "timeStart": 1525702394.248,
  "executionPoints": [
    1525702394.863065,
    1525702394.866609,
    1525702394.870812,
    1525702394.874702,
    1525702394.878718,
    1525702394.882434,
    1525702394.886418,
    1525702394.890428,
    1525702394.894365,
    1525702394.899119
  ],
  "executionTimes": [
    0.6150650978088379,
    0.6186091899871826,
    0.622812032699585,
    0.626702070236206,
    0.6307179927825928,
    0.6344339847564697,
    0.6384181976318359,
    0.6424281597137451,
    0.6463651657104492,
    0.6511189937591553
  ]
}

所以最后一次执行测量不到 0.7 秒,但是脚本执行停止了。

我已经做了很多研究,但我就是不明白为什么我的脚本做了不应该做的事情。任何想法将不胜感激。

标签: phpsymfonyemailsymfony-3.4

解决方案


推荐阅读