有没有办法让事件观察者在Magento中异步?我想在客户下订单后在后台运行一些耗时的脚本,但我的理解是,当一个事件被调度时,观察者的代码会同步/立即执行。
答案 0 :(得分:5)
正如@ user3438533所提到的,你可以实现这一目标的一种方法是在你的观察者触发时安排一个工作,后者可以由cron执行。这样做是安全的,因为将来pending
中cron_schedule
状态的作业将被清除。
自从你提出购买以来,我们以此为例。您需要能够create a simple extension才能将此付诸行动。下订单后用于执行操作的常见事件是sales_order_place_after
,因此我们将使用它来触发未来的自定义cron作业。
第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>
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;
}
}