odesílání mailů přesáhne execution time

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jarda256
Člen | 130
+
0
-

Ahoj, mám databázi registrací a účastníků. Používám nette 2.4 a doctrine. Funkcí sendAllMails bych potřeboval na každý mail uvedený u registrace a účastníka cca 1400 mailů poslat informace. Spouštím funkci přes ajax handle na tlačítku, takže se mi nepřidá error log. Nějaký nápad jak script rozkouskovat, ale aby stále šel spustit přes jedno tlačítko. Případně jak to udělat aby celý script proběhl.

Předem děkuju za rady

Editoval jarda256 (9. 7. 2017 22:48)

igor.pocta
Člen | 100
+
+7
-

A kde ti to běží? Na běžném hostingu nebo na stroji, do kterého si můžeš zasahovat sám (např. VPS).

Hosting? Pokud ti to neumře na počtu insertů, tak bych si vytvořil frontu v databázi, kterou bych zpracovával přes webcron.

Pokud vlastní stroj, tak bych použil RabbitMQ nebo výše uvedenou frontu spouštěl přes CLI.

Editoval igor.pocta (10. 7. 2017 0:23)

kejlicz
Člen | 201
+
+6
-

Ono hlavně posílat 1400 emailů najednou je ideální cesta, jak dostat svoji IP adresu na blacklisty spamfiltrů.

Editoval kejlicz (10. 7. 2017 13:05)

jarda256
Člen | 130
+
0
-

@kejlicz Tenhle problém neřeším…pošlu to jako request an mailgun a ten to nadávkuje…jde mi spíš o to, že ten script běží dlouho…když je to ajaxem tak ani do logu nehodí chybu

Editoval jarda256 (10. 7. 2017 13:29)

jarda256
Člen | 130
+
0
-

@igor.pocta Běží mi to na běžném hostingu. Naplnil bych si frontu, ale i při tom mi to exne…Je nějaká možnost jak bych si mohl vytáhnout všechny ty záznamy kam mám něco poslat cca tedy 1500 a postupně třeba po 200 z nich vytvářet záznamy do fronty, aniž bych tedy vyčerpal execution time

nightfish
Člen | 519
+
0
-

Vytáhni si z databáze prvních 200 nezpracovaných záznamů, vytvoř záznamy do fronty a označ si je jako zpracované. Zkontroluj, jestli existují nějaké nezpracované a pokud ano, tak přesměruj na stejnou stránku (ať už v PHP nebo Javascriptem). Tím se vyhneš time_limitu.

Číslo 200 z úvodu tohoto příspěvku zvol tak, aby ses bezpečně vlezl do limitu. Čím menší bude, tím větší bude režie zpracování (v extrémním případě, kdy budeš přesměrovávat po každém zpracovaném záznamu, ti bude čas na provádění přesměrování přesahovat čas, kdy skript vykonává užitečnou činnost).

Myiyk
Člen | 321
+
0
-

@jarda256 Nevím co posíláš za emaily, ale 1400 emailů dát do fronty by nemělo trvat moc dlouho.

Všechny selecty a inserty musíš dávat po větších dávkách, nevkládat každou položku samostatně. Ideálně to vkládat ještě v transakci, je to mnohem rychlejší.

kejlicz
Člen | 201
+
0
-

Myiyk napsal(a):

@jarda256 Nevím co posíláš za emaily, ale 1400 emailů dát do fronty by nemělo trvat moc dlouho.

Všechny selecty a inserty musíš dávat po větších dávkách, nevkládat každou položku samostatně. Ideálně to vkládat ještě v transakci, je to mnohem rychlejší.

Pokud to chápu dobře, tak to nevkládá do DB, ale posílá jako jednotlivé HTTP requesty na API služby mailgun.com. Nezmám tohle API, ale určitě bude mít i nějakou možnost že se ty data pošlou po více emailech a ne jen po jednom.