Magento 2はcron:run CLIコマンドなしで特定のCronを実行しますか?


14

長い話を短くすると、典型的なものを使用している場合、xdebugはcronファイルのブレークポイントで確実に停止しません。

php bin/magento cron:run

Xdebugはすべて適切にセットアップされており、動作することもありますが、85%の時間で動作せず、phpstormで接続のリッスンをオフにするまでCLIでハングします。

どういうわけか1つのcronファイルを実行する方法はありますか?理想的ではないxdebugで適切にテストするには、cronファイルの内容を別のコンソールコマンドに実際にコピーして貼り付ける必要がありました。

Magento 1.xでは、AOEスケジューラを使用して、Xdebugでcronジョブをテストするために使用しました。管理者に移動し、目的のチェックボックスをオンにし、ドロップダウンから実行を選択すると正常に機能しました。

私は次のようなものを使用したいと考えています:

php bin/magento modulename:cronjob

スケジュールされていない場合でも、常にcronを実行する必要があります。

回答:


16

シンプルだと思う!Cronクラスは「通常の」クラスです。Playgroundを使用してCronをテストできます。test.phpスクリプトでMagento 2をブートストラップするにはどうすればよいですか?。Object Managerが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を使用しているため、ルートディレクトリをチェックしません。そのため、pub。ディレクトリにTest.phpとTestApp.phpを配置する必要がありました。その後、Test.phpのパスを以下に合わせて調整しました:require '../app/bootstrap.php'; TestApp.phpでも: が必要 return $this->_response; です。そうしないと、phpstormスクリーンショットにあるエラーがスローされますが、実際のコードはスローされません。これであなたの答えを編集してみます。
ケビンチャベス

@KevinJavitzどういたしまして!
コアTruongDinh

17

開発時間を節約するためのオプションは、N98MageRun for Magento 2 を使用することです。

これには素晴らしいコマンドsys:cron:listsys:cron:run

これらのコマンドを使用すると、cronの特定のジョブコードを見つけて、コマンドラインからそのcronのみをトリガーできます。

経由で簡単にインストールできますcomposer require-dev n98/magerun2。Magento2を使用する場合は、devへのインストールをお勧めします


OMG Waoコマンドでcronjobを実行する最良の方法
学習者

4

次の2つのファイルを使用して実現できます。

次のようなプロジェクトのルートにフォルダーとクラスを作成します。

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.