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通过Xdebug来测试cron作业,方法是去管理员,选中我想要的那个,然后从下拉列表中选择run,它运行良好。

我正在寻找使用类似的东西:

php bin/magento modulename:cronjob

即使没有计划,它也应始终运行cron。

Answers:


16

想想简单!Cron类是“普通”类。我们可以使用Playground来测试Cron:如何在test.php脚本中引导Magento 2?。对象管理器将创建我们的Cron对象。然后,我们可以通过直接在浏览器上调用url来测试Cron。

**请注意,如果使用Nginx,则可以将这些文件放在pub /文件夹中,并将Test.php文件的require路径调整为 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目录中。之后,我将Test.php上的路径调整为: require '../app/bootstrap.php'; 同样在TestApp.php上也需要设置: return $this->_response; 否则它将在phpstorm屏幕截图上抛出错误,但没有实际代码。我将尝试以此编辑您的答案。
凯文·查韦斯

@KevinJavitz不客气!
Khoa TruongDinh

18

为了节省开发时间,可以选择将N98MageRun用于Magento 2。

这有很棒的命令sys:cron:listsys:cron:run

使用这些命令,您将能够找到您的cron的特定作业代码,然后从命令行中仅触发该cron。

可以很容易地通过安装它composer require-dev n98/magerun2,我建议在使用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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.