Magento 2 esegue un Cron specifico senza cron: eseguire il comando CLI?


14

Per farla breve xdebug non si fermerà in modo affidabile sui punti di interruzione nei miei file cron quando uso il tipico:

php bin/magento cron:run

Xdebug è tutto configurato correttamente e a volte funzionerà, ma l'85% delle volte non lo farà e si bloccherà nella CLI fino a quando non spengo l'ascolto per le connessioni in phpstorm.

C'è un modo per eseguire un solo file cron in qualche modo? Ho dovuto effettivamente copiare e incollare il contenuto del mio file cron in un comando console separato per testarlo correttamente in xdebug che non è l'ideale.

In Magento 1.x usavo AOE Scheduler per testare i lavori cron con Xdebug andando all'amministratore, selezionando la casella che volevo e scegliendo esegui dal menu a discesa e funzionava bene.

Sto cercando di usare qualcosa come:

php bin/magento modulename:cronjob

che dovrebbe sempre eseguire il cron anche se non è pianificato.

Risposte:


16

Pensa semplice! La classe Cron è una classe "normale". Possiamo usare un Playground per testare il nostro Cron: come posso avviare Bootstrap Magento 2 in uno script test.php? . Il Gestore oggetti creerà il nostro oggetto Cron. E quindi, possiamo testare il nostro Cron chiamando l'URL direttamente sul browser.

** Nota se si utilizza Nginx è possibile inserire questi file nella cartella pub / e regolare il percorso richiesto per il file 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;

 }

inserisci qui la descrizione dell'immagine


1
Grazie, questo ha funzionato per me, ma con un po 'di modifica. Dato che sto usando Nginx non controlla la directory principale, quindi ho dovuto mettere Test.php e TestApp.php nella directory pub. Dopo di che ho modificato il percorso su Test.php necessario: require '../app/bootstrap.php'; anche su TestApp.php ci deve essere il: return $this->_response; o genererà un errore che hai sullo screenshot di phpstorm ma non il codice reale. Proverò a modificare la tua risposta con questo.
Kevin Chavez,

@KevinJavitz sei il benvenuto!
Khoa TruongDinh,

18

L'opzione per risparmiare nei tempi di sviluppo sarebbe usare N98MageRun per Magento 2.

Questo ha i comandi meravigliosi sys:cron:liste sys:cron:run.

Usando questi comandi sarai in grado di trovare il codice lavoro specifico per il tuo cron e quindi attivare solo quel cron dalla riga di comando.

Può essere facilmente installato tramite composer require-dev n98/magerun2e raccomanderei che dovrebbe essere un'installazione di sviluppo quando si lavora con Magento 2


OMG Wao è il modo migliore per eseguire cronjob con un solo comando
Learner

4

È possibile ottenere utilizzando due file:

crea cartella e classe nella radice del progetto come:

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

Crea un altro file di classe:

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

Per eseguire cron vai a cli con il percorso root del progetto ed esegui sotto il comando:

php crons/cronprocess.php

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.