我需要一种异步运行某些任务的方法,因为每个任务之间的执行时间不尽相同,我希望以使用Laravel Jobs和数据库作为驱动程序的异步方式运行。Laravel Jobs不是异步的
我创建使用命令行来测试工作: PHP工匠制作:工作TestOne PHP工匠制作:工作TestTwo
TestOne.php
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class TestOne extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
sleep(5);
foreach (range(1, 10) as $item)
\Log::info("TestOne: item #" . $item);
}
}
TestTwo.php
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class TestTwo extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
foreach (range(1, 10) as $item)
\Log::info("TestTwo: item #" . $item);
}
}
我只是在laravel的日志文件中记录了一些消息,并且由于TestOne正在休眠5秒,TestTwo应该首先记录消息
HomeController.php
<?php
namespace App\Http\Controllers;
use Queue;
use App\Jobs\TestOne;
use App\Jobs\TestTwo;
class HomeController extends Controller
{
public function index()
{
$this->dispatch(new TestOne());
$this->dispatch(new TestTwo());
die("stop");
}
}
然而TestTwo工作仍然等待TestOne作业完成:
[2017-03-04 17:00:30] local.INFO: TestOne: item #1
[2017-03-04 17:00:30] local.INFO: TestOne: item #2
[2017-03-04 17:00:30] local.INFO: TestOne: item #3
[2017-03-04 17:00:30] local.INFO: TestOne: item #4
[2017-03-04 17:00:30] local.INFO: TestOne: item #5
[2017-03-04 17:00:30] local.INFO: TestOne: item #6
[2017-03-04 17:00:30] local.INFO: TestOne: item #7
[2017-03-04 17:00:30] local.INFO: TestOne: item #8
[2017-03-04 17:00:30] local.INFO: TestOne: item #9
[2017-03-04 17:00:30] local.INFO: TestOne: item #10
[2017-03-04 17:00:30] local.INFO: TestTwo: item #1
[2017-03-04 17:00:30] local.INFO: TestTwo: item #2
[2017-03-04 17:00:30] local.INFO: TestTwo: item #3
[2017-03-04 17:00:30] local.INFO: TestTwo: item #4
[2017-03-04 17:00:30] local.INFO: TestTwo: item #5
[2017-03-04 17:00:30] local.INFO: TestTwo: item #6
[2017-03-04 17:00:30] local.INFO: TestTwo: item #7
[2017-03-04 17:00:30] local.INFO: TestTwo: item #8
[2017-03-04 17:00:30] local.INFO: TestTwo: item #9
[2017-03-04 17:00:30] local.INFO: TestTwo: item #10
我与php artisan queue:listen
运行的作业我在做什么错在这里?我真的需要这些任务异步运行,就像说,一个JS AJAX请求会起作用。
我正在使用Laravel 5.2。再次,我使用“数据库”作为队列驱动程序,是的,我已经迁移了作业表。使用数据库作为驱动程序是不可能的?
感谢您的回答。好的,如果Asynchronous在这种情况下是错误的术语,那么你会怎么称呼它?如何在实际应用程序中使用'queue:work'?我还使用队列发送电子邮件,因为我的应用程序严重依赖发送电子邮件。 –
你的控制器是异步的,你的队列不是。你为什么需要异步队列?你可能不会。 –