У нас есть скрипт, который контролирует базу данных. В базе данных хранятся данные JSON и fromName и fromEmail. Если временная метка handledAt пуста, электронная почта все еще должна быть отправлена. Итак, мы создали cronjob, который отслеживает столбец handledAt. Если он не указан, электронное письмо должно быть отправлено.
Наши сценарии работают нормально, но немного медленно. Поэтому мне было интересно, правильно ли мы это делаем.
Захватить все электронные письма, которые должны быть отправлены
foreach($ResultSelectEmails AS $key => $value)
{
require_once '../library/Twig/Autoloader.php';
Twig_Autoloader::register();
$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader, array(
'cache' => '../tmp/cache/'
));
$Contents = $twig->render(stripslashes($Templ['templateHTML']), $EData);
$Subject = $twig->render(stripslashes($Templ['templateSubject']), $EData);
$WriteFile = fopen('logs/'.$PDFLogFile.'.html','w');
fwrite($WriteFile, $Contents);
fclose($WriteFile);
// Create the Transport
$transport = Swift_SmtpTransport::newInstance('mail.example.com', 25)
->setUsername('[email protected]')
->setPassword('examplePassword')
;
// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance($Subject)
->setFrom(array($ResultSelectEmails[$key]['fromEmail'] => $ResultSelectEmails[$key]['fromName']))
->setTo(array($ResultSelectEmails[$key]['toEmail']))
->setBody($Contents, 'text/html', 'UTF-8')
;
if(isset($EmailAttachements))
{
foreach($EmailAttachements AS $key => $value)
$message->attach(Swift_Attachment::fromPath($value));
}
$result = $mailer->send($message);
}
В скрипте мы создаем отдельный транспорт для каждого письма. Иногда почтовый сервер выдает ошибку. Главным образом это не может войти.
Можем ли мы улучшить производительность скрипта?
Ждем ваших мыслей ….
Я вижу некоторые вызовы, которые вы не должны делать в цикле foreach. Я не знаю, сколько писем вы хотите отправить, но это не оптимально. Поскольку вы не обрабатываете цикл параллельно, вы можете переместить несколько строк наружу, что должно препятствовать повторному созданию некоторых экземпляров. Я не знаю точного назначения вашего кода, и без каких-либо подробностей трудно сказать, является ли это заметным улучшением, но вы можете попробовать:
require_once '../library/Twig/Autoloader.php';
Twig_Autoloader::register();
$loader = new Twig_Loader_String();
$twig = new Twig_Environment($loader, array(
'cache' => '../tmp/cache/'
));
// Create the Transport
$transport = Swift_SmtpTransport::newInstance('mail.example.com', 25)
->setUsername('[email protected]')
->setPassword('examplePassword')
;
// Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);
foreach ($ResultSelectEmails AS $key => $value) {
$Contents = $twig->render(stripslashes($Templ['templateHTML']), $EData);
$Subject = $twig->render(stripslashes($Templ['templateSubject']), $EData);
$WriteFile = fopen('logs/' . $PDFLogFile . '.html', 'w');
fwrite($WriteFile, $Contents);
fclose($WriteFile);
$message = Swift_Message::newInstance($Subject)
->setFrom(array($ResultSelectEmails[$key]['fromEmail'] => $ResultSelectEmails[$key]['fromName']))
->setTo(array($ResultSelectEmails[$key]['toEmail']))
->setBody($Contents, 'text/html', 'UTF-8')
;
if (isset($EmailAttachements)) {
foreach ($EmailAttachements AS $key => $value)
$message->attach(Swift_Attachment::fromPath($value));
}
$result = $mailer->send($message);
}
Других решений пока нет …