這篇文章主要介紹了PHP的Laravel框架中使用訊息佇列queue及非同步佇列的方法,針對Laravel 5.0後的版本,範例環境為Linux系統,需要的朋友可以參考下
#queue配置
首先說明我之前的專案中如何使用queue的。
我們現在的專案都是用的symfony,老一點的專案用的symfony1.4,新一點的專案用的都是symfony2。 symfony用起來整體感覺還是很爽的,尤其是symfony2,整體上來講使用了很多java裡面框架的設計思想。但是他不支持queue。在symfony,我們使用queue也經歷了幾個過程。最開始使用張堰同學的httpsqs。這個簡單使用,但是有單點。畢竟我們的專案還是正式對外服務的,所以我們研究了Apache旗下的開源專案ActiveMQ,研究研究發現還有Apache旗下還有更新的MQ,那就是Apollo。最後我們決定使用的Apollo。
queue在我們的專案中主要的應用情境就是非同步處理一些比較耗時的功能,例如同步第三方資料、資料有變動了同步通知到我們的第三方資料使用者等等。我們大致的思路是這樣的,在各個controller裡面如果需要非同步處理的,就把一個json物件encode一下,塞到Apollo裡面。再寫一個work的Command,在這個Command中解析json對象,依照裡面的action和參數決定來呼叫不同的方法處理。依照業務需求同時在不同的機器上執行Command作為守護程式一直跑著,也算實現非同步多工應用的方案。就這麼一直使用著,直到發現了laravel。打算研究一下。如果可能替代一下也不是不可能。呵呵。
由於才開始學習,當然直接上laravel5。 routes、controller、view都基本上和symfony差異不到,上手倒是不難。最後研究一下queue。
1、安裝laravle,使用composer,倒是很簡單。
composer global require "laravel/installer=~1.1" vi ~/.bash_profile
把~/.composer/vendor/bin 加入環境變數。
source ~/.bash_profile
就可以直接在命令列中使用laravel了。試一下。
laravel -V
能夠看到下面的,就代表成功了。
Laravel Installer version 1.2.1
2、建立專案。
laravel new guagua
3、設定redis和queue。
4、創建controller,
#php artisan make:controller DefaultController
在controller的action中push100個queue的任務。
for($i = 0; $i < 100; $i ++) { Queue::push(new SendEmail("ssss".$i)); }
5、建立queue的Command
php artisan make:command SendEmail --queued##修改app/Commands/SendEmail.php,新增一個私有變數。
protected $msg;同時修改建構子。
public function __construct($msg) { $this->msg = $msg; }再修改的handle方法
#
public function handle() { sleep(4); echo $this->msg."\t".date("Y-m-d H:i:s")."\n"; $this->delete(); }##6、修改routes
Route::get('/', [ 'as' => 'index', 'uses' => 'DefaultController@index' ]);7、監聽queue
php artisan queue:listen
為了驗證多工處理,我們同時開三個視窗執行同樣的指令。
8、用laravel內建的server啟動服務php artisan serve --port 8080
開啟瀏覽器,造訪http:// localhost:8080/頁。當然也可以用nginx,apache之類的。但需要各種配置,還是內建的使用方便。
在控制台就能看到各個queue執行的情況了,如下圖。可以看到100個任務被三個work平分了。
到此,基本上達到了我想要的效果。驗證了laravel可以簡單實作queue,並且可以多工處理。
make command產生的程式碼中use App\Commands\Command ,但執行時提示沒有這個檔案。解決方法,修改為 use Illuminate\Console\Command; 不知道為什麼會出現這個低階問題,難道是我mac系統問題,還是我的人品問題。
在controller的action中push隊列的時候,沒有非同步執行,還是在action的腳本中執行的。發現是設定問題,原來不只修改config中的queue.php,還要修改.evn中相關設定。雖然問題解決了,但還是覺得蛋疼,不能理解。還需要在學習學習laravel。關於佇列的定義,這裡就不作介紹了。我們要使用非同步佇列就有兩個關鍵:
(1)存储队列的地方
(2)执行任务的服务
打开 config/queue.php ,这是Laravel5关于队列的配置文件。首先我们可以通过 default 参数指定默认队列驱动,默认配置是 sync , 这是同步队列,我们要做异步队列首先就要改变这里。假设我们用 database 作为驱动,队列任务将会存放在数据库中,而我们后面会另外启动一个后台服务来处理队列任务,这就是异步方式了。
'default' => 'database'
修改完配置后,我们需要创建一个表来存放队列任务,Laravel5已经在自带artisan命令中内置了一个指令用来生成数据迁移,只需要两条命令即可,当然你得实现配置好数据库连接。
php artisan queue:table php artisan migrate
这样就自动在数据库中创建了 jobs 表。
2.启动队列监听服务
通过下面这条指令启动队列监听服务,它会自动处理 jobs 表中的队列任务:
php artisan queue:listen
在linux中,如果想让它在后台执行,可以这样:
nohup php artisan queue:listen &
3.添加队列任务
关于队列任务的添加,手册里说的比较详细,这里就简单举个例子吧。
首先,通过artisan创建一个队列命令:
php artisan make:command SendEmail --queued
这样会生成 app/Commands/SendEmail.php 这个类文件,这个类会被标识为队列命令,你可以在 handle 方法中写自己的业务逻辑。
在控制器中,可以简单通过 Bus::dispatch 分发任务:
Bus::dispatch(new \App\Commands\SendEmail());
你会发现任务不会立即执行,而是被放到 jobs 表中,由队列监听服务处理。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上是關於PHP的Laravel框架中使用訊息佇列queue及非同步隊列的方法分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!