即使有延迟,Laravel也会立即处理排队的工作

Mic*_*usa 26 jobs laravel-5

我目前正在开发关于私人服务器(例如Minecraft服务器)的个人应用程序,并且由于查询服务器需要一些时间,我决定实施排队作业,但是,它们工作不正常,即使在调用时也会立即运行它们被延迟,导致页面请求的大量延迟.

这是我的HomeController的索引(),它调用作业以30秒的延迟更新每个服务器:

public function index()
{
    $servers = Server::all();

    foreach($servers as $server)
    {
       //Job Dispatch
       $job = (new UpdateServer($server->id))->delay(30);
       $this->dispatch($job);
    }
    return view('serverlist.index', compact('servers'));
}
Run Code Online (Sandbox Code Playgroud)

更新服务器的作业类如下:

class UpdateServer extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels;
    protected $id;

    public function __construct($id)
    {
       $this->id = $id;
    }

    public function handle(){
       $server = Server::findOrFail($this->id);

       //preparing the packet
       $test = new RAGBuffer();
       $test->addChar('255');
       $test->addChar('1');
       $test->addShort(1 | 8);

       //finding the server
       $serverGame = new RAGServer($server->server_ip);

       //Get server info
       $status = $serverGame->sendPacket($test);

       $server->onlinePlayers = $status->getOnline();
       $server->peakPlayers = $status->getPeak();
       $server->maxPlayers = $status->getMax();

       if (!$server->save()) {
           //error ocurred
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

每当HomeController的index()运行时,页面请求都会出现大量延迟,我按照Laravel官方网页上的教程,试图找到答案而没有任何答案.

那么,我做错了什么?为什么这个工作没有延迟30秒,然后在我的服务器后台执行此操作?先感谢您.

另外:handle()正在做它应该做的事情,它查询服务器,发送数据包并用正确的信息更新我的数据库.

chr*_*con 34

您必须在项目的根目录.env文件中设置要使用的队列驱动程序.

默认情况下,队列驱动程序sync与您描述的完全相同,即时执行队列.

您可以选择一些不同的队列驱动程序,例如beanstalked或redis(这将是我的选择).在laracasts.com上有一个关于建立一个beanstalked队列的优秀免费赠品.

要查看laravel中所有可用的队列驱动程序选项,请查看此处.

这是一个.env示例

APP_ENV=local
APP_DEBUG=true
APP_KEY=SomeRandomString

DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync      //< put the desired driver here

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
Run Code Online (Sandbox Code Playgroud)


Joh*_*lor 11

在我意识到Laravel 5.7在.env文件中将QUEUE_DRIVER重命名为QUEUE_CONNECTION之前,这使我疯狂了好多年。

  • 天啊。谢谢。我也刚刚发生过。 (2认同)

小智 10

对于已进行上述更改但仍无法正常工作的人员,请检查队列文件的默认值,如下所示: dd(Config::get('queue.default'))

对我来说,在刷新配置缓存之前它没有改变:

php artisan config:clear
Run Code Online (Sandbox Code Playgroud)


Raf*_*ski 7

要在本地进行测试,您可以将驱动程序设置为

QUEUE_DRIVER=database
Run Code Online (Sandbox Code Playgroud)

并运行php artisan queue:table

然后php artisan migrate,这样你就可以将你的队列保存到数据库中,这样你就可以直观地看到发生了什么。

要运行你的队列,只需运行php artisan queue:listen ... 并让它像你一样运行artisan serve


Luc*_*eca 6

如果您正在运行php artisan serve,请重新启动并php artisan serve再次运行.这对我有用,经过几个小时试图想知道它是什么.:)