odesílání mailů přesáhne execution time
- jarda256
- Člen | 130
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
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)
- jarda256
- Člen | 130
@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
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).
- kejlicz
- Člen | 201
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.