Magento 2, cron: run CLI komutu olmadan belirli bir Cron çalıştırıyor mu?


14

Uzun bir hikaye kısa yapmak için xdebug, tipik olarak kullanırken cron dosyalarımdaki kesme noktalarında güvenilir bir şekilde durmaz:

php bin/magento cron:run

Xdebug tüm düzgün kurulum ve bazen işe yarayacak ama zamanın% 85'i phpstorm bağlantılarını dinleyene kadar CLI'de asılı kalmayacak.

Bir şekilde sadece bir cron dosyasını çalıştırmanın bir yolu var mı? Aslında cron dosya içeriğini kopyalamak ve ideal olmayan xdebug düzgün test etmek için ayrı bir konsol komut yapıştırmak zorunda kaldı.

Magento 1.x'te Xdebug ile cron işlerini test etmek için admin'e gidip istediğim kutuyu işaretleyerek ve açılır menüden çalıştırmayı seçerek AOE Zamanlayıcı'yı kullandım ve işe yaradı.

Şunun gibi bir şey kullanmak istiyorum:

php bin/magento modulename:cronjob

programlanmasa bile her zaman cron'u çalıştırmalıdır.

Yanıtlar:


16

Basit düşünün! Cron sınıfı "normal" bir sınıftır. Cron'umuzu test etmek için bir Oyun Alanı kullanabiliriz: Magento 2'yi bir test.php betiğinde nasıl önyükleyebilirim? . Nesne Yöneticisi Cron Nesnemizi oluşturacaktır. Ardından, URL'yi doğrudan Tarayıcı üzerinden arayarak Cron'umuzu test edebiliriz.

** Nginx kullanıyorsanız, bu dosyaları pub / klasöre koyabileceğinizi ve Test.php dosyasının gerekli yolunu 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;

 }

resim açıklamasını buraya girin


1
Teşekkür ederim, bu benim için çalıştı ama biraz tweaking ile. Nginx kullandığım için kök dizini kontrol etmez, bu yüzden pub dizinine Test.php ve TestApp.php koymak zorunda kaldı. Bundan sonra Test.php yolunu ayarlamak gerekir: require '../app/bootstrap.php'; ayrıca TestApp.php üzerinde olması gerekir: return $this->_response; ya da phpstorm ekran görüntüsünde sahip olduğunuz bir hata atar, ancak gerçek kodu. Cevabınızı bununla düzenlemeye çalışacağım.
Kevin Chavez

@ KevinJavitz Rica ederim!
Khoa TruongDinh

18

Geliştirme süresi kurtarmak için seçeneği Magento 2 için N98MageRun kullanmak olacaktır .

Bu harika komutlara sahiptir sys:cron:listve sys:cron:run.

Bu komutları kullanarak cron'unuz için özel iş kodunu bulabilir ve daha sonra komut satırından sadece o cronu tetikleyebilirsiniz.

Kolayca kurulabilir composer require-dev n98/magerun2ve Magento 2 ile çalışırken dev kurulumuna gitmenizi tavsiye ederim


OMG Wao sadece bir komutla cronjob çalıştırmak için en iyi yol
Öğrenci

4

İki dosya kullanarak başarabilirsiniz:

projenin kök dizininde klasör ve sınıf oluşturun:

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

Başka bir sınıf dosyası oluşturun:

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'u çalıştırmak için proje kök yolu ile cli'ye gidin ve aşağıdaki komutu çalıştırın:

php crons/cronprocess.php

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.