Magento 2 chạy một Cron cụ thể không có cron: chạy lệnh CLI?


14

Để tạo một câu chuyện dài xdebug ngắn sẽ không dừng lại một cách đáng tin cậy trên các điểm dừng trong các tệp cron của tôi khi sử dụng điển hình:

php bin/magento cron:run

Xdebug là tất cả các thiết lập đúng và đôi khi nó sẽ hoạt động nhưng 85% sẽ không hoạt động và chỉ dừng lại ở CLI cho đến khi tôi tắt nghe các kết nối trong phpstorm.

Có cách nào để chạy chỉ một tập tin cron không? Tôi đã phải thực sự sao chép và dán nội dung của tệp cron của mình vào một lệnh console riêng để kiểm tra nó đúng cách trong xdebug không lý tưởng.

Trong Magento 1.x, tôi đã từng sử dụng Bộ lập lịch AOE để kiểm tra các công việc định kỳ với Xdebug bằng cách truy cập quản trị viên, đánh dấu vào mục tôi muốn và chọn chạy từ danh sách thả xuống và nó hoạt động tốt.

Tôi đang tìm cách sử dụng một cái gì đó như:

php bin/magento modulename:cronjob

mà nên luôn luôn chạy cron ngay cả khi nó không được lên lịch.

Câu trả lời:


16

Nghĩ đơn giản! Lớp Cron là lớp "bình thường". Chúng tôi có thể sử dụng Sân chơi để kiểm tra Cron của mình: Làm cách nào tôi có thể bootstrap Magento 2 trong tập lệnh test.php? . Trình quản lý đối tượng sẽ tạo Đối tượng Cron của chúng tôi. Và sau đó, chúng tôi có thể kiểm tra Cron của mình bằng cách gọi url trực tiếp trên Trình duyệt.

** Lưu ý nếu sử dụng Nginx, bạn có thể đặt các tệp này vào pub / thư mục và điều chỉnh đường dẫn yêu cầu cho tệp Test.php thành 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;

 }

nhập mô tả hình ảnh ở đây


1
Cảm ơn bạn, điều này làm việc cho tôi nhưng với một chút điều chỉnh. Vì tôi đang sử dụng Nginx nên nó không kiểm tra thư mục gốc, vì vậy tôi phải đặt Test.php và TestApp.php trong thư mục pub. Sau đó, tôi đã điều chỉnh đường dẫn trên Test.php yêu cầu: require '../app/bootstrap.php'; cũng trên TestApp.php cần phải có: return $this->_response; hoặc nó sẽ đưa ra một lỗi mà bạn có trên ảnh chụp màn hình phpstorm của bạn chứ không phải mã thực tế. Tôi sẽ cố gắng và chỉnh sửa câu trả lời của bạn với điều này.
Kevin Chavez

@KevinJavitz bạn được chào đón!
Khoa TruongDinh

17

Tùy chọn để tiết kiệm trong thời gian phát triển sẽ là sử dụng N98MageRun cho Magento 2.

Điều này có các lệnh tuyệt vời sys:cron:listsys:cron:run.

Sử dụng các lệnh này, bạn sẽ có thể tìm mã công việc cụ thể cho cron của mình và sau đó kích hoạt chỉ cron đó từ dòng lệnh.

Nó có thể dễ dàng cài đặt qua composer require-dev n98/magerun2và tôi khuyên bạn nên cài đặt dev khi làm việc với Magento 2


OMG Wao cách tốt nhất để chạy cronjob chỉ bằng một lệnh
Học viên

4

Bạn có thể đạt được bằng cách sử dụng hai tệp:

tạo thư mục và lớp trong root của dự án như:

crons / Cron ProcessApp.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;
    }
}
?>

Tạo một tệp lớp khác:

crons / Cron Process.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);

Để chạy cron, hãy truy cập cli với đường dẫn gốc của dự án và chạy bên dưới lệnh:

php crons/cronprocess.php

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.