2015-06-27 151 views
16

我目前正在开发我个人的应用程序,是关于私人服务器(例如,我的世界服务器),并自查询服务器需要花费一些时间,我决定实现排队的作业立即处理的作业,但是,他们工作不正常,即使被延迟时也会立即运行,导致页面请求出现严重延迟。Laravel排队甚至延迟

这里是我的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')); 
} 

作业类更新服务器如下:

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 
     } 
    } 
} 

每当HomeController的index()运行,页面请求出现大量延迟,我在Laravel的官方网页上跟着教程,试图找到答案,而没有任何答案。

那么,我做错了什么?为什么工作不会延迟30秒,然后在我的服务器中在后台执行此操作?先谢谢你。

另外:手柄()是做什么是应该,它查询服务器,发送数据包,并用正确的信息更新我的数据库。

+2

我必须使用'调度问题()'。当我切换到'\ Queue :: later(delay,job)'事情开始工作。 – QuickDanger

回答

18

你必须设置你想在你的项目的根目录的文件.env使用队列驱动程序。

默认情况下,队列司机sync这确实你所描述的到底是什么,执行队列立刻。

为beanstalked或Redis的(这是我的选择),您可以选择这样一些不同的队列驱动程序。 laracasts.com上有一个关于设置beanstalked队列的excellent freebie

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

这里有一个.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 
+0

感谢您的回答,我想我会尝试beanstalked队列,那么,从我的理解来看,它的工作原理就像后台进程一样吗?它不会影响页面或任何东西的加载时间? –

+0

不应该有任何影响(除了带宽,如果你是下载或上传你的脚本的东西,但这应该不成问题)。 Beanstalked是一个不错的选择,如果你按照视频,它会在几分钟内设置。 – baao

+0

太糟糕了,我没有在laracasts帐户,因为它是必要的,将尝试按照其他教程,将您的问题标记为接受,只要我得到这个工作,谢谢你的时间! –

1

本地测试你可以在驱动器设置为

QUEUE_DRIVER=database 

和运行PHP工匠队列:表 然后PHP工匠迁移所以你会得到你的队列保存到数据库,所以你可以在视觉上本身什么`怎么回事..

并运行你的队列简单运行php artisan queue:listen ..并把它作为运行您工匠做服务

2

有人谁取得了上述改动,仍然没有工作,检查这样的队列文件的默认值:dd(Config::get('queue.default'))

对我来说没” T改变,直到刷新缓存配置:

php artisan config:clear 
+0

对于本地开发重新启动工匠服务器应该做的伎俩(我经常忘记) –

1

确保

'default' => env('QUEUE_DRIVER', 'database'), 
在配置/ queue.php

QUEUE_DRIVER=database 

在.ENV文件,以确保数据库驱动程序用于