Magento 2 menjalankan Cron tertentu tanpa cron: jalankan perintah CLI?

14

Untuk membuat cerita panjang, xdebug tidak akan berhenti pada breakpoints di file cron saya saat menggunakan tipikal:

php bin/magento cron:run

Xdebug sudah diatur dengan benar dan kadang-kadang akan berfungsi tetapi 85% dari waktu tidak akan dan hanya bertahan di CLI sampai saya mematikan mendengarkan koneksi di phpstorm.

Apakah ada cara untuk menjalankan hanya satu file cron? Saya harus benar-benar menyalin dan menempelkan isi file cron saya ke perintah konsol terpisah untuk mengujinya dengan benar di xdebug yang tidak ideal.

Di Magento 1.x saya dulu menggunakan Penjadwal AOE untuk menguji pekerjaan cron dengan Xdebug dengan pergi ke admin, mencentang yang saya inginkan, dan memilih lari dari dropdown dan itu bekerja dengan baik.

Saya ingin menggunakan sesuatu seperti:

php bin/magento modulename:cronjob

yang harus selalu menjalankan cron bahkan jika itu tidak dijadwalkan.

Kevin Chavez
sumber

Jawaban:

16

Berpikir sederhana! Kelas Cron adalah kelas "normal". Kita bisa menggunakan Playground untuk menguji Cron kami: Bagaimana saya bisa bootstrap Magento 2 dalam skrip test.php? . Manajer Obyek akan membuat Objek Cron kami. Dan kemudian, kita dapat menguji Cron kita dengan memanggil url langsung di Browser.

** Catatan jika menggunakan Nginx Anda dapat meletakkan file-file ini di pub / folder dan menyesuaikan jalur yang diperlukan untuk file Test.php ke 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;

 }

masukkan deskripsi gambar di sini

Khoa TruongDinh
sumber
1
Terima kasih, ini berhasil untuk saya tetapi dengan sedikit penyesuaian. Karena saya menggunakan Nginx itu tidak memeriksa direktori root, jadi saya harus meletakkan Test.php dan TestApp.php di direktori pub. Setelah itu saya menyesuaikan jalur di Test.php perlu: require '../app/bootstrap.php'; juga di TestApp.php perlu ada: return $this->_response; atau itu akan melempar kesalahan yang Anda miliki di screenshot phpstorm Anda tetapi bukan kode yang sebenarnya. Saya akan mencoba dan mengedit jawaban Anda dengan ini.
Kevin Chavez
@KevinJavitz sama-sama!
Khoa TruongDinh
18

Pilihan untuk menghemat waktu pengembangan adalah menggunakan N98MageRun untuk Magento 2.

Ini memiliki perintah yang luar biasa sys:cron:listdan sys:cron:run.

Dengan menggunakan perintah ini, Anda akan dapat menemukan kode pekerjaan spesifik untuk cron Anda dan kemudian memicu cron itu dari baris perintah.

Ini dapat dengan mudah diinstal melalui composer require-dev n98/magerun2dan saya akan merekomendasikan itu harus menjadi instalasi dev ketika bekerja dengan Magento 2

David Manners
sumber
OMG Wao cara terbaik untuk menjalankan cronjob hanya dengan sebuah perintah
Learner
4

Anda dapat menggunakan dua file:

buat folder dan kelas di root proyek seperti:

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;
    }
}
?>

Buat file kelas lain:

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);

Untuk menjalankan cron, pergi ke cli dengan path root proyek dan jalankan perintah di bawah ini:

php crons/cronprocess.php
Pramod Kharade
sumber