laravel5.1 基於redis實現任務隊列

laravel5.1 基於redis實現任務隊列

一、服務器配置redis

以ubuntu爲例:php

一、安裝redishtml

$ sudo apt-get install redis-server

安裝完成後可使用如下命令查看redis服務是否啓動laravel

$ ps aux | grep redis

若是沒有,則輸入redis

$ sudo service redis-server start

啓動後,使用express

$ redis-cli

進入redis命令行,能夠用如下命令行測試存儲apache

$ set test "hello word"
$ get test

二、配置redisubuntu

配置遠程登陸,默認redis是不容許遠程登陸的,須要咱們配置,windows

==但若是應用服務器和redis安裝在同個服務器中,則不須要作這一步。==api

#編輯redis配置文件
$ sudo vi /etc/redis/redis.conf
#註釋掉下面這一行。
# bind 127.0.0.1

配置密碼登陸緩存

#編輯redis配置文件
$ sudo vi /etc/redis/redis.conf
#找到下面這一行並去除註釋
# requirepass foobared #未修改以前
#修改以後,123456是設置的redis密碼
requirepass 123456

三、重啓redis

$ sudo service redis-server restart
# 或者能夠手動殺掉進程,再開啓
$ sudo killall redis-server
$ sudo redis-server /etc/redis/redis.conf

能夠在別的客戶端中測試鏈接(客戶端已經配置好redis)

# -h接redis服務器地址,-p端口號,-a密碼
$ redis-cli -h 192.168.1.188 -p 6379 -a 123456

二、應用服務器安裝php redis擴展

注意:若是redis使用頻率不高,只是該項目使用,能夠不用安裝php的redis擴展,直接在對應的laravel項目安裝predis擴展包(從開發編碼實現那步開始)

==因爲測試時咱們以本身的電腦當應用服務器,以windows爲例:==

(1)redis的php擴展下載地址:
http://windows.php.net/downlo...

根據本身的php版本和系統版本,下載對應的擴展包,解壓
文件「php_redis-2.2.5-5.5-ts-vc11-x64.zip」是php5.5版本的。

(2)將解壓文件中的php_redis.dll放到php的擴展目錄ext下。

(3)在apache的php.ini配置文件下加上extension=php_redis.dll

(4)重啓apache。

查看phpinfo是否有redis的擴展,若是有,則說明php-redis安裝成功。

==以ubuntu爲例==

$ sudo apt-get install php5-redis

重啓apache

$ sudo /etc/init.d/apache2 restart

查看phpinfo是否有redis的擴展,若是有,則說明php5-redis安裝成功。

三、開發編碼實現

(1)須要安裝predis擴展包

$ composer require "predis/predis:~1.0"

php artisan config:cache

(2)配置文件中.env中須要增長隊列驅動的配置

QUEUE_DRIVER=redis
REDIS_HOST=192.168.1.188

(3)config/database.php配置redis的鏈接參數

'redis' => [

        'cluster' => false,

        'default' => [
            'host'     => env('REDIS_HOST', '127.0.0.1'),
            'port'     => 6379,
            'database' => 0,
            'password' => env('REDIS_PASSWORD', '123456')
        ],

    ],

(4)在appJobs中建立任務類,當隊列處理該任務時執行的handle方法。
這裏以咱們實際代碼爲例:

<?php

namespace App\Jobs;

use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;

use App\Classes\LogisticApi\LogisticSdk\alibaba\AlibabaClient;

use Illuminate\Support\Facades\Redis;
/**
* 阿里巴巴無憂物流建立線上發貨createWarehouseOrder後,
* 國際物流單號不是實時返回,須要間隔1-2分鐘調用查詢接口進行查詢
* 此任務主要進行阿里getOnlineLogisticsInfo接口的查詢
*/
class AligetOnlineLogisticsInfo extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    /**
    * 訂單ID
    * @var string
    */
    protected $order_id;

    /**
    * api 帳號信息
    * @var array
    */
    protected $api_account;

    /**
     * Create a new job instance.
     *
     * @param string $order_id  訂單ID
     * @param string $seller_id 
     *
     * @return void
     */
    public function __construct($order_id, $api_account){
        $this->order_id    = $order_id;
        $this->api_account = $api_account;
    }

    /**
     * Execute the job.
     * 獲取getOnlineLogisticsInfo物流信息
     *
     * @return void
     */
    public function handle(){

        $alibaba_client = new AlibabaClient($this->api_account);
        $response = $alibaba_client->getOnlineLogisticsInfo(['orderId' => $this->order_id]);
        print_r($response);
        //TODO 抓取失敗後的處理,後續根據業務需求來處理

    }
}

(5)推送任務到隊列。
使用了DispatchesJobs trait。該trait提供了一些容許你方便推送任務到隊列的方法,例如dispatch方法。能夠爲任務指定隊列,也能夠延遲任務。
以咱們實際業務爲例:

namespace App\Classes\LogisticApi;

use App\Classes\LogisticApi\LogisticTrackingAbstract;

use App\Classes\LogisticApi\LogisticSdk\alibaba\AlibabaClient;
use App\Models\Erp_aliexpress_order_master;
use App\Models\Erp_aliexpress_order_slave;
use App\Models\Erp_logistics_setting;
use App\Models\Erp_aliexpress_token;

use Illuminate\Foundation\Bus\DispatchesJobs;
use App\Jobs\AligetOnlineLogisticsInfo;
/**
* ocs物流對接
*/
class logisticTrackingWuyou extends LogisticTrackingAbstract {

    use DispatchesJobs;
    /**
    *
    */
    public function __construct(){

    }

    /**
    * 獲取tracking數據
    *
    * @param array $api_data   訂單數據,能夠是訂單號之類的
    * @param array $api_param  接口參數數據
    * @param string $save_path 保存運單圖片的路徑
    *
    * @return array tracking
    */
    public function getTracking(array $api_data, array $api_param, $save_path){

        //獲得訂單信息
        $order = $this->getOrder($api_data['order_id']);
        //獲得對應的訂單帳號信息
        $api_account = $this->getApiAccountInfo($order['seller_id']);

        $alibaba_client = new AlibabaClient($api_account);

        $params = $this->setCreateWarehouseOrderApiParams($order, $alibaba_client);

        if(isset($seller_address->error_code)){
            return $params;
        }

        $response = $alibaba_client->createWarehouseOrder($params);
        //成功了,推送隊列任務獲取getOnlineLogisticsInfo國際物流,
        //國際物流返回不是實時返回,須要等待1-2分鐘
        if(true == $response->success){
            //推入getOnlineLogisticsInfo隊列並延遲120秒執行
            $job = (new AligetOnlineLogisticsInfo($api_data['order_id'], $api_account))->delay(120);
            $this->dispatch($job);

        }

        return $response;

    }

}

==注意,因爲咱們沒有正式的業務情景測試,因此使用單元測試,在測試以前,須要配置好單元測試的隊列驅動,在phpunit.xml中,注意
如下QUEUE_DRIVER,須要將其改成redis,或者刪掉。==

<env name="QUEUE_DRIVER" value="sync"/>

四、運行隊列監聽器

(1)應用服務器監聽

若是以前有 php artisan config:cache 緩存配置,最好先把配置緩存清除:php artisan config:clear。

測試過程當中,可使用 ==php artisan queue:listen==進行監聽。

線上可使用 ==php artisan queue:work --daemon==

詳細的監聽方式能夠查看:http://laravelacademy.org/pos...

(2)redis服務器監聽

redis-cli鏈接redis後,可使用==monitor==查看隊列狀況。

具體能夠參考:

http://laravelacademy.org/pos...

http://laravelacademy.org/pos...

相關文章
相關標籤/搜索