Spouštění funkcí asynchronně
- Honza_Vaclavik
- Člen | 20
Zdravím,
potřebuju spouštět mailer metodu pro odesílaní notikací o nové zakázce
asynchronně, protože jinak to zásadně prodlouží proces vytváření
zakázky.
Vím, že php nepodporuje implicitně vytváření nových threadů (alespoň
jsem nic takového nenašel), ale určitě se to dá nějak obejít. Byl by mi
někdo schopný mi poradit?
Zatím jsem to zkoušel nějak takhle, ale hází to chybu STMP maileru. „SMTP server did not accept HELO localhost with error“
Tohle je v modelu po přidání zakázky do databáze
foreach ($emailsObject as $emailObject) {
$asyncMailSending = new ASyncMailNotification($this->mailer, $emailObject->email, $order);
$asyncMailSending->run();
$asyncMailSending->wait(50000);
}
Tady ta třída, ze které je ta instance $asyncMailSending
<?php
/**
* Created by PhpStorm.
* User: honzavaclavik
* Date: 12/03/16
* Time: 00:05
*/
namespace App\Mailer;
use Nette;
use Thread;
class ASyncMailNotification extends \Thread
{
private $mailer;
private $email;
private $order;
public function __construct(Mailer $mailer, $email, $order)
{
$this->email = $email;
$this->mailer = $mailer;
$this->order = $order;
}
public function run() {
parent::run();
date_default_timezone_set("Europe/Prague");
$this->mailer->newOrderNotificationMail($this->email, $this->order);
}
}
Mockrát děkuji za jakoukoli radu.
Editoval Honza_Vaclavik (12. 3. 2016 12:09)
- Pavel Kravčík
- Člen | 1196
A nestačí na to obyčejná fronta?
- Vytvoření objednávky
- Přidání ID do tabulky order_mail_queny (id, object_id, process [0]) – to zabere 0.01ms
- Pak někde zvlášť běží minutový cron, který odesílá vše ve frontě, co má process = 0 a nastavuje ho na 1 – průběh objednávky to nebrzdí a maily v minutových intervalech, navíc se dá hlídat i to, jestli nějaký neodešel apod.
Používáme na sjednávání smluv (~200 mailů denně).
Editoval Pavel Kravčík (12. 3. 2016 12:16)
- Honza_Vaclavik
- Člen | 20
Pavel Kravčík napsal(a):
A nestačí na to obyčejná fronta?
- Vytvoření objednávky
- Přidání ID do tabulky order_mail_queny (id, object_id, process [0]) – to zabere 0.01ms
- Pak někde zvlášť běží minutový cron, který odesílá vše ve frontě, co má process = 0 a nastavuje ho na 1 – průběh objednávky to nebrzdí a maily v minutových intervalech, navíc se dá hlídat i to, jestli nějaký neodešel apod.
Používáme na sjednávání smluv (~200 mailů denně).
Děkuji, to zní realizovatelně a jednoduše. Měl bych ještě otázku ohledně spouštění Cronů na localhostu – používám PHP Development Server, žádný xampp apod. a nevím, jakým způsobem bych to spouštěl. Nemáte s tím zkušenosti?
Editoval Honza_Vaclavik (12. 3. 2016 12:43)
- Pavel Kravčík
- Člen | 1196
Crony jsou jednoduché. Napíšu správci serveru a on mi to nastaví. :D V tom se příliš neorientuji. Ale určitě to půjde googlovat.
Na localhostu jde jednoduše „simulovat“ cron prostým spuštěním požadované adresy.
Minutové spouštění cronu neznamená, že se odešle 1 mail za minutu. Neměřil jsem ani netestoval, ale myslím, že za tu minutu se určitě stihne poslat mraky. Co koukám do databáze, tak zpracovat 40 mailů nezabralo ani celou vteřinu.
Jinak špatné není ani tohle řešení http://developer.mailchimp.com/…chimp-api-3/. Nebo podobné služby.
Editoval Pavel Kravčík (12. 3. 2016 12:40)
- Myiyk
- Člen | 321
@Honza_Vaclavik na linuxu cron zprovozníš jednoduše https://www.debian-administration.org/…ng_with_cron
windows má taky systémovou podporu http://windows.microsoft.com/…chedule-task#…
V jednom cronu pošleš všechny maily, takže všech 31 zaměstnanců dostane email do minuty.
Editoval Myiyk (12. 3. 2016 12:42)
- Honza_Vaclavik
- Člen | 20
petr.jirous napsal(a):
@Honza_Vaclavik co použít RabbitMQ? to je přesně pro tyto případy ;)
Děkuji,
na to jsem koukal, ale obávám se, že to nepůjde na hostingu zprovoznit,
pokud jsem službu správně pochopil. Buhužel nemám virtuální server.
Editoval Honza_Vaclavik (12. 3. 2016 12:45)
- Honza_Vaclavik
- Člen | 20
Myiyk napsal(a):
@Honza_Vaclavik na linuxu cron zprovozníš jednoduše https://www.debian-administration.org/…ng_with_cron
windows má taky systémovou podporu http://windows.microsoft.com/…chedule-task#…V jednom cronu pošleš všechny maily, takže všech 31 zaměstnanců dostane email do minuty.
Já jsem ale bohužel z té třetí strany… Na OS X to ale snad budu fungovat podobně jako na linuxu, přeci jenom je to Unix-like systém. Děkuji.
- Honza_Vaclavik
- Člen | 20
Pavel Kravčík napsal(a):
Crony jsou jednoduché. Napíšu správci serveru a on mi to nastaví. :D V tom se příliš neorientuji. Ale určitě to půjde googlovat.
Na localhostu jde jednoduše „simulovat“ cron prostým spuštěním požadované adresy.
Minutové spouštění cronu neznamená, že se odešle 1 mail za minutu. Neměřil jsem ani netestoval, ale myslím, že za tu minutu se určitě stihne poslat mraky. Co koukám do databáze, tak zpracovat 40 mailů nezabralo ani celou vteřinu.
Jinak špatné není ani tohle řešení http://developer.mailchimp.com/…chimp-api-3/. Nebo podobné služby.
Mockrát Vám děkuju, moc jste mi pomohl, já jsem byl už uplně ztracen a tohle mě nenapadlo. Jsem přeci jenom pořád začátečník.
- Honza_Vaclavik
- Člen | 20
Myiyk napsal(a):
@Honza_Vaclavik na OS X by to mělo jít stejně jako na debianu. (nezkoušel jsem)
Hostingy umožňují nastavit cron přes administraci. Ale záleží na hostingu, jak moc často jde spouštět cron. Třeba u wedos i přes příplatek nejde spouštět častěji jak každých 5min
Děkuji, hned to na localhostu zkusím. Cron bude na hostingu (eBola.cz) bez problému, jde tam nastavit minutový interval.