Запуск наблюдателя событий Magento асинхронно


Есть ли способ сделать наблюдателя событий асинхронным в Magento? Я хотел бы использовать это для запуска нескольких трудоемких сценариев в фоновом режиме после того, как клиент разместил заказ, но, насколько я понимаю, при отправке события код наблюдателя выполняется синхронно/немедленно.

Author: fantasticrice, 2015-04-28

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;
    }
}
 5
Author: fantasticrice, 2015-05-05 21:36:54