Запуск наблюдателя событий Magento асинхронно
Есть ли способ сделать наблюдателя событий асинхронным в Magento? Я хотел бы использовать это для запуска нескольких трудоемких сценариев в фоновом режиме после того, как клиент разместил заказ, но, насколько я понимаю, при отправке события код наблюдателя выполняется синхронно/немедленно.
1 answers
Один из способов, которым вы могли бы это сделать, как упоминал @user3438533, - это запланировать задание при запуске вашего наблюдателя, которое может быть выполнено позже cron. Это безопасно, потому что задания, запланированные на будущее со статусом pending
в cron_schedule
, не будут удалены.
Раз уж вы заговорили о покупке, давайте используем это в качестве примера. Вам нужно будет иметь возможность создать простое расширение , чтобы реализовать это в действии. Обычное событие, используемое для выполнения действий после того, как заказ был было размещено sales_order_place_after
, поэтому мы будем использовать это для запуска будущего пользовательского задания cron.
Etc/config.xml
Шаг 1. Настройте наблюдателя событий в разделе config/frontend/events
:
<sales_order_place_after>
<observers>
<scheduleExampleJob>
<class>My_Example_Model_Observer</class>
<method>scheduleExampleJob</method>
</scheduleExampleJob>
</observers>
</sales_order_place_after>
Шаг 2. Настройте обработчик заданий cron, который будет прослушивать новое пользовательское задание, созданное в наблюдателе в разделе config/crontab/jobs
:
<my_example_job>
<!-- @see My_Example_Model_Observer::scheduleExampleJob -->
<run><model>My_Example_Model_Observer::runExampleJob</model></run>
</my_example_job>
Model/Observer.php
class My_Example_Model_Observer
{
/**
* Triggers my_example_job to get scheduled when it gets fired.
* @param Varien_Event_Observer $observer
* @return $this
*/
public function scheduleExampleJob(Varien_Event_Observer $observer)
{
// Calculate your needed datestamp to schedule the future job.
$scheduleAt = Mage::getModel('core/date')->timestamp('Y-m-d H:i:s', strtotime('30 minutes from now'));
Mage::getModel('cron/schedule')
->setJobCode('my_example_job') // Needs to match config/crontab/jobs node
->setStatus(Mage_Cron_Model_Schedule::STATUS_PENDING)
->setScheduledAt($scheduleAt)
->save();
}
/**
* Handler for my_example_job, executed from crontab.
* @param $schedule
* @return $this
*/
public function runExampleJob($schedule)
{
// Do your asynchronous work!
return $this;
}
}