Я пытаюсь отправить большее количество писем с использованием PHP в систему Symfony 3.4. Теперь скрипт останавливается из-за ограничения времени выполнения php, что, конечно, мне нужно обойти.
Моя идея состоит в том, чтобы поместить все электронные письма для отправки в таблицу email_queue и затем отправлять их после того, как они будут сохранены в очереди.
Таким образом, я сохраняю все эти электронные письма, отображаю страницу с индикатором выполнения и выполняю Ajax-вызов, который должен отослать электронные письма в срок, превышающий ограничение по времени, сообщать, сколько оно было отправлено (чтобы обновить индикатор выполнения) и если что-то осталось в очереди, повторный вызов вызывается до тех пор, пока все не будет отправлено.
Пока все хорошо. Теперь я пытаюсь измерить время выполнения части скрипта 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 секунды, но там выполнение сценария было остановлено.
Я уже провел много исследований, но я просто не могу понять, почему мой сценарий делает то, чего не должен. Любые идеи будут высоко оценены.