Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny][Symfony2][SF2]Swift_Message powolne zapisywanie do spoola
Forum PHP.pl > Forum > PHP > Frameworki
prz3kus
Witam,
potrzebuje wysłać kilkadziesiąt tysięcy maili, chciałem zapisać sobie wszystkie maile do spoola typu file (czyli do plików) i potem wysłać w cronie.

Problem jest taki że 200 maili do spoola ładuje sie 30min a ich wielkości są bardzo różne pomimo, że zawartość to pięć identycznych dla każdego maila obrazków w sumie ważących niecałe 200KB, a wielkości generowanych plików w spoolu wacha się od 50MiB do 247KiB jest to dla mnie niezrozumiałe :/

oto kawałek mojego kodu i config

  1. swiftmailer:
  2. transport: "%mailer_transport%"
  3. host: "%mailer_host%"
  4. username: "%mailer_user%"
  5. password: "%mailer_password%"
  6. # spool: { type: memory }
  7. spool:
  8. type: file
  9. path: '%kernel.cache_dir%/swiftmailer/spool'


  1. $baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
  2. $message = \Swift_Message::newInstance();
  3.  
  4. $query = 'SELECT * FROM tabelka LIMIT 2000';
  5. foreach($db->query($query) as $wiersz)
  6. {
  7.  
  8. $nr_klienta = 'xxx;
  9. $secret = 'xxx;
  10. $emailTo = 'xxx;
  11. $message->setContentType("text/html")
  12. ->setSubject('Zapraszamy do ZZZ - nr klienta: '.$nr_klienta)
  13. ->setFrom('zzz@zzz.pl')
  14. ->setTo($emailTo)
  15. ->setReplyTo('zzz@zzz.pl')
  16. ->setBody($this->renderView('ZZZBundle:_emailViews:zzz.html.twig',
  17. array(
  18. 'topMail' => $message->embed(Swift_Image::fromPath($baseurl.'/bundles/zzz/images/topMail.jpg')),
  19. 'textMail_1' => $message->embed(Swift_Image::fromPath($baseurl.'/bundles/zzz/images/textMail_1.png')),
  20. 'textMail_2' => $message->embed(Swift_Image::fromPath($baseurl.'/bundles/zzz/images/textMail_2.png')),
  21. 'buttonMail' => $message->embed(Swift_Image::fromPath($baseurl.'/bundles/zzz/images/buttonMail.png')),
  22. 'bottomMail' => $message->embed(Swift_Image::fromPath($baseurl.'/bundles/zzz/images/bottomMail.jpg')),
  23. 'secret' => $secret
  24.  
  25. )));
  26. $message->getHeaders()->addTextHeader('X-MAILTAGS', ZZZ_TEST');
  27.  
  28. $this->get('mailer')->send($message);
  29. }


Domyślam się że coś namieszałem tylko co?

Nie wiem czemu nie mogę edytować tematu w zawartości mam same krzaczki więc piszę niżej sad.gif

Dodałem do konfiga:

  1. logging: false


Teraz jest o wiele lepiej 100 maili generuje się około minuty tylko nadal pliki są spore, chodź ich wielkość spadło o połowę.

Teraz 100 wygenerowanych w spoolu message waży 1GiB więc średnio 10MiB wiadomości, a powinna co-najmniej 20 razy mniej sad.gif
destroyerr
Co do czasu generowania to nie wiemy na czym to uruchamiasz, więc może jest całkiem krótki.
W plikach powinny być zserialozowane wiadomości. Jeżeli rozmiary są takie duże to być może, pojawia się jakiś błąd i serializowany jest cały kontener (choć i tak wydaje się to dużo) lub jakiś var_dump. Nie wiem co może być źle, bo nie mam doświadczenia. Mogę Ci zaproponoważ wykonanie tej pętli bez użycia funkcji send, a do plików html zapisuj wynik funkcji renderView. Możesz też w pętli serializować wiadomość i sprawdzać rozmiar, czy też są takie problemy. Możesz też spróbować odserializować plik ze spool (np. z największym rozmiarem) i sprawdzić co w nim siedzi.
Podziel się wynikami eksperymentów.
prz3kus
Na końcu każdej wiadomości dodaje coś takiego:

Cytat
s:37:"\0Swift_Mime_SimpleMimeEntity\0_encoder";O:47:"Swift_Mime_ContentEncoder_QpContentEncoderProxy":3:{s:60:"\0Swift_Mime_ContentEncoder_QpContentEncoderProxy\0safeEncoder";O:42:"Swift_Mime_ContentEncoder_QpContentEncoder":3:{s:14:"\0*\0_charStream";O:39:"Swift_CharacterStream_NgCharacterStream":9:{s:52:"\0Swift_CharacterStream_NgCharacterStream\0_charReader";N;s:59:"\0Swift_CharacterStream_NgCharacterStream\0_charReaderFactory";r:14;s:49:"...................


I ta linijka waży czasem kilka MiB sama reszta wiadomości to 10KiB. I czasem te linijka mam 200KiB a czasem 50MiB

Dziwny jest ten świat biggrin.gif

Sprawa się wyjaśniła za każdym razem trzeba w pętli uruchamiać

Cytat
$message = \Swift_Message::newInstance();


inaczej ciągle dodawał mi Headers maila do ostatnio utworzonego pliku, dlatego pliki mi rosły

dzięki destroyerr za próbę pomocy

Pozdrawiam czas na weekend biggrin.gif


EDIT:123213

Jeszcze napiszę, że teraz zapisuję sie do spolla w minutę ponad 2000 wiadomości wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.