【问题标题】:How to manually run a laravel/lumen job using command line如何使用命令行手动运行 laravel/lumen 作业
【发布时间】:2017-09-07 12:31:55
【问题描述】:

我在app/Jobs/MyJob.php 文件夹中创建了一个作业文件,如果可能的话,我想只运行一次它。

类似:

> php MyJob:run

我应该使用什么命令来运行这个文件或句柄中的方法?

【问题讨论】:

    标签: php laravel shell laravel-5 lumen


    【解决方案1】:

    更新

    我创建了mxl/laravel-job composer 包,提供 Laravel 命令用于从命令行调度作业:

    $ composer require mxl/laravel-job
    $ php artisan job:dispatch YourJob # for jobs in app/Jobs directory (App\Jobs namespace)
    $ php artisan job:dispatch '\Path\To\YourJob' # dispatch job by its full class name
    $ php artisan job:dispatchNow YourJob # dispatch immediately
    $ php artisan job:dispatch YourJob John 1990-01-01 # dispatch with parameters
    

    包还提供了一种通过使用基本Job 类来减少样板文件的方法,并具有FromParameters 接口,允许同时从PHP 代码和命令行实现命令行参数解析和使用作业。

    the package GitHub page了解更多关于它的功能。

    老答案

    运行

    php artisan make:command DispatchJob
    

    创建运行作业的特殊工匠命令。

    打开创建的DispatchJob.php 文件并像这样定义DispatchJob 类:

    class DispatchJob extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'job:dispatch {job}';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Dispatch job';
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            $class = '\\App\\Jobs\\' . $this->argument('job');
            dispatch(new $class());
        }
    }
    

    现在你应该启动队列工作者了:

    php artisan queue:work
    

    然后你可以从命令行运行作业:

    php artisan job:dispatch YourJobNameHere
    

    【讨论】:

    • 太棒了,但我得到了 - mongodb/mongodb 1.5.2 需要 ext-mongodb ^1.6 -> 请求的 PHP 扩展 mongodb 安装了错误的版本 (1.3.4)。
    • @LeoGasparrini 我的包仅使用 "laravel/framework": "^5.5" 依赖项。这更有可能是您的项目依赖项的问题。
    【解决方案2】:

    最简单的方法是使用 Tinker 调用

    这是用于调试的 Laravel 命令,通过从项目根目录运行以下命令来使用它

    php artisan tinker
    

    通过 tinker 在特定队列上调度作业

    \Queue::pushON('rms', new App\Jobs\UpdateRMS());

    第一个参数 - 队列名称

    第二个参数 - 作业名称

    一次将多个作业分派到特定队列

    \Queue::bulk([new App\Jobs\UpdateRMS(), new App\Jobs\UpdateRMS()], null, 'rms');
    

    Demo(product-service是我的项目名)跟着就行 在队列中查找已调度的作业)我的案例队列配置为Redis

    【讨论】:

    • 请在您的答案中添加一些进一步的解释 - 它不包含如何使用 CLI 运行它的任何信息
    • 嗨 Nico,我添加了更多细节,希望对您有所帮助。
    【解决方案3】:

    如果您使用不同于 syncQUEUE_DRIVER 并且您想要调度您之前创建的队列,请从您的项目文件夹中运行以下命令:

    php artisan queue:work --queue=MyQueueName
    

    选中此link 以配置数据库 QUEUE_DRIVER

    【讨论】:

    • 意识到我正在创建不同的队列,添加块 --queue=QueueName 非常关键
    【解决方案4】:

    用于参数可选的作业

    试试这个

    class DispatchJob extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'job:dispatch {job} {parameter?}';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Dispatch job';
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            $prefix = '\\App\Jobs\\';
    
            $jobClassName = trim($this->argument('job'));
            if(stripos($jobClassName,"/")){
                $jobClassName = str_replace('/','\\',$jobClassName);
            }
            $class = '\\App\\Jobs\\' . $jobClassName;
    
            if(!class_exists($class)){
                $this->error("{$class} class Not exists");
            }else {
                if ($this->argument('parameter')) {
                    $job = new $class($this->argument('parameter'));
                } else {
                    $job = new $class();
                }
    
                dispatch($job);
                $this->info("Successfully Dispatch {$class} ");
            }
    
        }
    }
    

    现在你可以在终端中这样尝试

    1.无文件夹

    php artisan job:dispatch appJob
    

    2.带文件夹

    php artisan job:dispatch folderName/appJob 
    

    3.带参数的文件夹

    php artisan job:dispatch folderName/appJob 12
    

    【讨论】:

      猜你喜欢
      • 2019-10-05
      • 2015-04-27
      • 2016-10-18
      • 2020-04-12
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 2014-10-07
      • 2016-12-10
      相关资源
      最近更新 更多