Zpomalena aplikace pri cronu

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

Zdravím,

mám problém. Napsal jsem si script do cronu, který každých 5 minut vytáhne 50 mailových adres a rozešle jim newsletter. To samo o sobě je v pohodě, akorát že problém je, že jsem to napsal normálně jako součást aplikace (např na adrese /mailing/rozeslat) a když ten script běží (což běží třeba 10–20 vteřin) tak v ten okamžik se jakoby celá aplikace „zamrzne“ a jde hrozně zpomaleně, dokud ten script nedoběhne. Jakoby nette mělo nějakou ochranu, že když se jednomu nenačte script, tak dalšímu se nezapne.

Nevím, jestli jsem to logicky popsal. Napadá Vás, jak to vyřešit? Samozřejmě nejsnažší řešení je dát ten cron stranou a nedávat ho jako součást aplikace, ale to jsem zrovna nechtěl…

David Matějka
Moderator | 6445
+
0
-

a ten script uz spousti cron, nebo to nejak testujes rucne? pak by totiz mohlo dojit k blokovani session.

Duch.Veliky
Člen | 68
+
0
-

Teď už ho spouští cron a když ho zapne, tak to lze poznat podle toho, že web se pořádně nenačte dokud nedoběhne.

Duch.Veliky
Člen | 68
+
0
-

Působí to prostě jako kdyby Nette vždycky generovalo cache pro prvního návštěvníka a dokud nedoběhne ten jeho script, tak ostatní návštěvníci musejí čekat. Je to záhada :)

David Matějka
Moderator | 6445
+
0
-

Ano, na nekterych mistech nette zamkne aplikaci a ceka na vygenerovani cache – prikladem je generovani containeru. ale po vygenerovani dojde k uvoleneni zamku.

nepouzivas treba nekde nejak spatne konkurencni cachovani ? nebo nezamykas tabulky v mysql?

bylo by dobre zkusit odmazat co nejvice kodu (a nahradit ho treba jen za sleep(20)) a pokusit se zjistit, jestli to opravdu zpusobuje nette nebo tvuj kod..

iguana007
Člen | 970
+
0
-

A jak to testuješ? Necháváš ten skript skutečně spustit cronem nebo si otevřeš dva taby v browseru a v jednom spustíš ala cron a v druhém třeba homepage webu?

Duch.Veliky
Člen | 68
+
0
-

No dal jsem tam sleep(30) místo celýho scriptu a 30 vteřin nešla načíst aplikace. Až když uběhlo 30 vteřin a tamten script doběhnul, tak se načetla.

Duch.Veliky
Člen | 68
+
0
-

Ale tedle test se sleep(30) jsem dělal ve dvou tabech v jednom browseru

David Matějka
Moderator | 6445
+
+1
-

@Duch.Veliky to radeji provadej v anonymnim okne nebo v jinem prohlizeci, jinak ti to budou blokovat session…

iguana007
Člen | 970
+
0
-

@Duch.Veliky – proto jsem se tě na to ptal, je to přesně jak říká @matej21 ;)
Hoď si to na server – dej si tam hodně dlouhý sleep – a uvidíš, že zatímco se ti spustí cron, tak v browseru se ti ta stránka normálně načte – pokud tam tedy opravdu nemáš nějaký závažnější problém v návrhu aplikace.

Duch.Veliky
Člen | 68
+
0
-

Jo máte oba pravdu, v anonymnim okně to jede, takže to blokovala session. Tak to znamená, že to musí dělat ten script, i když jenom sáhne pro 50 záznamů z databáze kde jich je 17tisíc, rozešle 50 mailů a potom 50× provede update že tomu konkrétnímu uživateli už to bylo odesláno. Je to divný. Nějak to ještě pošteluju :)

díky

iguana007
Člen | 970
+
0
-

Myslím, že obdoba tvého problému, ne-li totéž se řeší teď na Devel.cz, tak si to projdi ;)
http://devel.cz/…erveru-nette

Editoval iguana007 (5. 9. 2014 16:56)

Duch.Veliky
Člen | 68
+
0
-

Jo to je super věc, díky :)