php المنصات - الزناد الماجنتو مراقب الحدث بشكل غير متزامن




بيع العربية (2)

هل هناك أي طريقة لجعل مراقب الحدث غير متزامن في الماجنتو؟ وأود أن استخدام هذا لتشغيل عدد قليل من البرامج النصية تستغرق وقتا طويلا في الخلفية بعد أن العملاء قد وضعت أمر، ولكن أفهم أنه عندما يتم إرسال الحدث، يتم تنفيذ رمز للمراقب تنفيذها بشكل متزامن / على الفور.


Answers

طريقة واحدة يمكن أن تحقق هذا، كما ذكر @ user3438533، هو جدولة وظيفة عندما المراقب الخاص بك الحرائق التي يمكن الحصول على تنفيذها في وقت لاحق من قبل كرون. فمن الآمن القيام بذلك لأن الوظائف المجدولة في المستقبل مع وضع pending في cron_schedule لن تحصل على تطهير.

منذ طرحت الشرائية، دعونا نستخدم ذلك كمثال. سوف تحتاج إلى أن تكون قادرة على إنشاء ملحق بسيط من أجل وضع هذا في العمل. حدث شائع يستخدم للقيام بالأشياء بعد وضع أمر هو sales_order_place_after ، لذلك سنستخدم ذلك لتشغيل وظيفة كرون المخصصة في المستقبل.

الخ / 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 . إعداد معالج العمل كرون التي سوف تستمع إلى وظيفة مخصصة جديدة تم إنشاؤها في المراقب تحت config/crontab/jobs :

<my_example_job>
    <!-- @see My_Example_Model_Observer::scheduleExampleJob -->
    <run><model>My_Example_Model_Observer::runExampleJob</model></run>
</my_example_job>

نموذج / 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;
    }
}

إذا قمت بالتحكم في الهدف الذي تريد الاتصال به بشكل غير متزامن (على سبيل المثال "longtask.php" الخاص بك) ، يمكنك إغلاق الاتصال من هذه النهاية ، وسيتم تشغيل كلا النصين بشكل متوازٍ. يعمل مثل هذا:

  1. quick.php يفتح longtask.php عبر cURL (لا يوجد سحر هنا)
  2. longtask.php يغلق الاتصال ويستمر (السحر!)
  3. إرجاع cURL إلى quick.php عند إغلاق الاتصال
  4. كلا المهام تستمر في نفس الوقت

لقد حاولت هذا ، ويعمل على ما يرام. ولكن لا تعرف quick.php أي شيء عن كيفية عمل longtask.php ، إلا إذا قمت بإنشاء بعض وسائل الاتصال بين العمليات.

جرب هذا الرمز في longtask.php ، قبل أن تفعل أي شيء آخر. سيغلق الاتصال ، لكن يستمر في العمل (ويمنع أي إخراج):

while(ob_get_level()) ob_end_clean();
header('Connection: close');
ignore_user_abort();
ob_start();
echo('Connection Closed');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();

يتم نسخ الكود من ملاحظات مساهمي دليل PHP وتحسن نوعًا ما.





php magento event-handling magento-1.8