异步触发Magento事件观察器

sud*_*sud 6 php event-handling magento magento-1.8

有没有办法让事件观察者在Magento中异步?我想在客户下订单后在后台运行一些耗时的脚本,但我的理解是,当一个事件被调度时,观察者的代码会同步/立即执行.

fan*_*ice 5

正如@ user3438533所提到的,你可以实现这一目的的一种方法是在你的观察者触发时安排一个工作,后者可以由cron执行.这样做是安全的,因为将来安排的pending状态为的作业cron_schedule将不会被清除.

自从你提出购买以来,我们以此为例.您需要能够创建一个简单的扩展,以便将其付诸实践.在下订单之后用于执行操作的常见事件是sales_order_place_after,因此我们将使用它来触发将来的自定义cron作业.

等/ 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>
Run Code Online (Sandbox Code Playgroud)

第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>
Run Code Online (Sandbox Code Playgroud)

型号/ 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;
    }
}
Run Code Online (Sandbox Code Playgroud)