Magento 2 รัน Cron เฉพาะโดยไม่มี cron: run คำสั่ง CLI หรือไม่


14

ในการทำให้ xdebug สั้น ๆ เป็นเรื่องยาวจะไม่หยุดบนเบรกพอยต์ในไฟล์ cron ของฉันเมื่อใช้งานทั่วไป:

php bin/magento cron:run

Xdebug มีการตั้งค่าทั้งหมดอย่างถูกต้องและบางครั้งมันจะทำงานได้ แต่ 85% ของเวลาจะไม่ทำงานและเพียงแค่แขวนใน CLI จนกว่าฉันจะปิดฟังการเชื่อมต่อใน phpstorm

มีวิธีเรียกใช้ไฟล์ cron เพียงไฟล์เดียวไหม? ฉันต้องคัดลอกและวางเนื้อหาของไฟล์ cron ของฉันไปยังคอนโซลคำสั่งแยกต่างหากเพื่อทดสอบอย่างถูกต้องใน xdebug ซึ่งไม่เหมาะ

ใน Magento 1.x ฉันเคยใช้ AOE Scheduler สำหรับการทดสอบงาน cron กับ Xdebug โดยไปที่ผู้ดูแลระบบทำเครื่องหมายในช่องที่ฉันต้องการและเลือกเรียกใช้จากเมนูแบบเลื่อนลงและทำงานได้ดี

ฉันกำลังมองหาที่จะใช้สิ่งที่ชอบ:

php bin/magento modulename:cronjob

ซึ่งควรรัน cron เสมอแม้ว่าจะไม่ได้กำหนดไว้

คำตอบ:


16

คิดว่าง่าย! คลาส Cron เป็นคลาส "ปกติ" เราสามารถใช้สนามเด็กเล่นเพื่อทดสอบ Cron ของเรา: ฉันจะ bootstrap Magento 2 ในสคริปต์ test.php ได้อย่างไร . Object Manager จะสร้าง Cron Object ของเรา จากนั้นเราสามารถทดสอบ Cron ของเราโดยการเรียก url บน Browser โดยตรง

** หมายเหตุถ้าใช้ Nginx คุณสามารถวางไฟล์เหล่านี้ใน pub / folder และปรับ path ที่ต้องการสำหรับไฟล์ Test.php require '../app/bootstrap.php';

test.php

<?php
require __DIR__ . '/app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('TestApp');
$bootstrap->run($app);

TestApp.php

 public function launch()
 {
        /** @var \Vendor\Module\Cron\Test $cron */
        $cron = \Magento\Framework\App\ObjectManager::getInstance()
            ->create('Vendor\Module\Cron\Test');

        $cron->execute();

        return $this->_response;

 }

ป้อนคำอธิบายรูปภาพที่นี่


1
ขอบคุณมันใช้งานได้สำหรับฉัน แต่มีการปรับเปลี่ยนเล็กน้อย เนื่องจากฉันใช้ Nginx มันไม่ได้ตรวจสอบไดเรกทอรีรูทดังนั้นฉันต้องใส่ Test.php และ TestApp.php ใน pub directory หลังจากนั้นฉันปรับเส้นทางใน Test.php จำเป็นต้อง: require '../app/bootstrap.php'; ยังบน TestApp.php ต้องมี: return $this->_response; หรือมันจะโยนข้อผิดพลาดที่คุณมีในภาพหน้าจอ phpstorm ของคุณ แต่ไม่ใช่รหัสจริง ฉันจะลองและแก้ไขคำตอบของคุณด้วยสิ่งนี้
Kevin Chavez

@KevinJavitz ยินดีต้อนรับ!
Khoa TruongDinh

18

ตัวเลือกในการประหยัดเวลาในการพัฒนาคือใช้N98MageRunสำหรับ Magento 2

นี้มีคำสั่งที่ยอดเยี่ยมและsys:cron:listsys:cron:run

การใช้คำสั่งเหล่านี้คุณจะสามารถค้นหารหัสงานที่เฉพาะเจาะจงสำหรับ cron ของคุณแล้วเรียกใช้ cron นั้นจากบรรทัดคำสั่ง

มันสามารถติดตั้งได้อย่างง่ายดายผ่านทางcomposer require-dev n98/magerun2และฉันอยากจะแนะนำว่าควรไปติดตั้ง dev เมื่อทำงานกับ Magento 2


OMG Wao วิธีที่ดีที่สุดในการรัน cronjob โดยเพียงแค่คำสั่ง
ผู้เรียน

4

คุณสามารถทำได้โดยใช้สองไฟล์:

สร้างโฟลเดอร์และคลาสในรูทของโปรเจคเช่น:

crons / CronprocessApp.php

    <?php
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
use phpseclib\Net\SFTP;
use phpseclib\Crypt\RSA;

class CronprocessApp
    extends \Magento\Framework\App\Http
    implements \Magento\Framework\AppInterface{

    public function __construct(
    \Magento\Framework\App\State $state,\Magento\Framework\App\Response\Http $response)
    {
        $this->_response = $response;
        //$state->setAreaCode('any area'); // or 'adminhtml', depending on your needs
        $state->setAreaCode('adminhtml'); // or 'adminhtml', depending on your needs
    }
    public function launch()
    {
        /** @var \Vendor\Module\Cron\Test $cron */
        $cron = \Magento\Framework\App\ObjectManager::getInstance()
            ->create('Custom\Preorder\Cron\ChangeVisiblityNonPreorderProduct'); //pass the name of your cron class path 
        $cron->execute();       


        return $this->_response;

    }
    public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
    {
        return false;
    }
}
?>

สร้างไฟล์คลาสอื่น:

crons / Cronprocess.php

 <?php
require __DIR__ . '/../app/bootstrap.php';
require __DIR__ . '/../crons/cronprocessApp.php';

$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('CronprocessApp');
$bootstrap->run($app);

หากต้องการเรียกใช้ cron ไปที่ cli พร้อมกับรูทโปรเจ็กต์และรันคำสั่งด้านล่าง:

php crons/cronprocess.php

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.