【发布时间】:2017-09-07 12:31:55
【问题描述】:
我在app/Jobs/MyJob.php 文件夹中创建了一个作业文件,如果可能的话,我想只运行一次它。
类似:
> php MyJob:run
我应该使用什么命令来运行这个文件或句柄中的方法?
【问题讨论】:
标签: php laravel shell laravel-5 lumen
我在app/Jobs/MyJob.php 文件夹中创建了一个作业文件,如果可能的话,我想只运行一次它。
类似:
> php MyJob:run
我应该使用什么命令来运行这个文件或句柄中的方法?
【问题讨论】:
标签: php laravel shell laravel-5 lumen
更新
我创建了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
【讨论】:
"laravel/framework": "^5.5" 依赖项。这更有可能是您的项目依赖项的问题。
最简单的方法是使用 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');
【讨论】:
如果您使用不同于 sync 的 QUEUE_DRIVER 并且您想要调度您之前创建的队列,请从您的项目文件夹中运行以下命令:
php artisan queue:work --queue=MyQueueName
选中此link 以配置数据库 QUEUE_DRIVER
【讨论】:
--queue=QueueName 非常关键
用于参数可选的作业
试试这个
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
【讨论】: