is there way make event observer asynchronous in magento? use run few time consuming scripts in background after customer has placed order, understanding when event gets dispatched, code observer gets executed synchronously/immediately.
one way accomplish this, @user3438533 mentioned, schedule job when observer fires can executed later cron. safe because jobs scheduled out in future pending
status in cron_schedule
not purged.
since brought purchasing, let’s use example. need able create simple extension in order put action. common event used things after order has been placed sales_order_place_after
, use trigger future custom cron job.
etc/config.xml
step 1. set event observer under config/frontend/events
:
<sales_order_place_after> <observers> <scheduleexamplejob> <class>my_example_model_observer</class> <method>scheduleexamplejob</method> </scheduleexamplejob> </observers> </sales_order_place_after>
step 2. set cron job handler listen new custom job created in observer under 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 scheduled when gets fired. * @param varien_event_observer $observer * @return $this */ public function scheduleexamplejob(varien_event_observer $observer) { // calculate needed datestamp schedule future job. $scheduleat = mage::getmodel('core/date')->timestamp('y-m-d h:i:s', strtotime('30 minutes now')); mage::getmodel('cron/schedule') ->setjobcode('my_example_job') // needs match config/crontab/jobs node ->setstatus(mage_cron_model_schedule::status_pending) ->setscheduledat($scheduleat) ->save(); } /** * handler my_example_job, executed crontab. * @param $schedule * @return $this */ public function runexamplejob($schedule) { // asynchronous work! return $this; } }