php - Desencadenar el observador de eventos de Magento de forma asincrónica
event-handling magento-1.8 (1)
Una forma de lograr esto, como se mencionó en @ user3438533, es programar un trabajo cuando el observador dispare y pueda ser ejecutado más tarde por cron. Es seguro hacer esto porque los trabajos programados en el futuro con estado pending
en cron_schedule
no se cron_schedule
.
Como mencionó la compra, usemos eso como ejemplo. Tendrá que ser capaz de crear una extensión simple para poner esto en acción. Un evento común utilizado para hacer las cosas después de que se ha realizado un pedido es sales_order_place_after
, por lo que lo usaremos para activar el futuro trabajo cron personalizado.
etc / config.xml
Paso 1 Configure el observador del evento en config/frontend/events
:
<sales_order_place_after>
<observers>
<scheduleExampleJob>
<class>My_Example_Model_Observer</class>
<method>scheduleExampleJob</method>
</scheduleExampleJob>
</observers>
</sales_order_place_after>
Paso 2 Configure el controlador de tareas cron que escuchará el nuevo trabajo personalizado creado en el observador en 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;
}
}
¿Hay alguna forma de hacer que un observador de eventos sea asincrónico en Magento? Me gustaría utilizar esto para ejecutar algunas secuencias de comandos que consumen tiempo en el fondo después de que un cliente ha realizado un pedido, pero mi entendimiento es que cuando se envía un evento, el código para el observador se ejecuta de forma síncrona / inmediata.