婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Laravel框架中隊列和工作(Queues、Jobs)操作實例詳解

Laravel框架中隊列和工作(Queues、Jobs)操作實例詳解

熱門標簽:重慶外呼電銷系統多少錢 濟源百應電銷機器人聯系方式 咸陽電銷 正規電銷機器人系統 南京3D地圖標注 嘟嘟云外呼系統 辦理400電話哪家好點 邢臺400電話辦理 南寧電話外呼系統線路

在我們的web應用中,經常會遇到這樣的情況:

用戶在進行了某項操作后,我們需要在后臺完成一個耗時且耗費資源的任務,以對應用戶的操作。

通常來說,web應用中的操作都是同步的(synchronous),即用戶的操作可以立即得到回饋。

但是在以上情況下,同步等待操作結果將是災難性的。比如用戶點擊了申請密碼重置郵件,倘若我們讓用戶一直停滯在等待頁面,直至郵件發送成功,那么用戶體驗將非常地不好,因為有時候可能需要很長的時間才能將郵件發送完成。

從另一個角度來說,如果我們服務器處于高負荷的情況,當多個用戶同時請求發送郵件等操作時,我們不希望同時地給服務器增加負荷,否則可能會導致服務器崩潰,造成無法預估的情況。

從以上的討論可以看出,我們需要一種機制,可以非同步地響應用戶操作,并且不會給服務器增加過大的負荷。

那么這樣一種機制就是Queues和Jobs(即隊列和工作)。

如果你系統地學習過計算機科學,那么隊列的概念你應該不陌生。假設我們去銀行辦事,我們拿了一個號,發現前面有8個人在等待,那么我們實際上就處在一個隊列之中,隊列中靠前的人會先被叫到號碼,并且叫號的順序即拿號的順序。這樣的隊列就叫做Queue,采用的是先到先處理的方式,不允許插隊的情況存在。而我們要辦的事情就叫Job。

在Laravel中,我們可以很方便地使用Queues及Jobs來達到我們的目的。首先我們需要先來看一下,Laravel中有哪些Queues。

打開config/queue.php,我們可以看到幾種常見的隊列設置:

return [      
  
  /*      
  |--------------------------------------------------------------------------      
  | Default Queue Connection Name      
  |--------------------------------------------------------------------------      
  |      
  | Laravel's queue API supports an assortment of back-ends via a single      
  | API, giving you convenient access to each back-end using the same      
  | syntax for every one. Here you may define a default connection.      
  |      
  */      
  
  'default' => env('QUEUE_DRIVER', 'sync'),      
  
  /*      
  |--------------------------------------------------------------------------      
  | Queue Connections      
  |--------------------------------------------------------------------------      
  |      
  | Here you may configure the connection information for each server that      
  | is used by your application. A default configuration has been added      
  | for each back-end shipped with Laravel. You are free to add more.      
  |      
  | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"      
  |      
  */      
  
  'connections' => [      
  
    'sync' => [      
      'driver' => 'sync',      
    ],      
  
    'database' => [      
      'driver' => 'database',      
      'table' => 'jobs',      
      'queue' => 'default',      
      'retry_after' => 90,      
    ],      
  
    'beanstalkd' => [      
      'driver' => 'beanstalkd',      
      'host' => 'localhost',      
      'queue' => 'default',      
      'retry_after' => 90,      
    ],      
  
    'sqs' => [      
      'driver' => 'sqs',      
      'key' => env('SQS_KEY', 'your-public-key'),      
      'secret' => env('SQS_SECRET', 'your-secret-key'),      
      'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),      
      'queue' => env('SQS_QUEUE', 'your-queue-name'),      
      'region' => env('SQS_REGION', 'us-east-1'),      
    ],      
  
    'redis' => [      
      'driver' => 'redis',      
      'connection' => 'default',      
      'queue' => 'default',      
      'retry_after' => 90,      
      'block_for' => null,      
    ],      
  
  ],      
  
  /*      
  |--------------------------------------------------------------------------      
  | Failed Queue Jobs      
  |--------------------------------------------------------------------------      
  |      
  | These options configure the behavior of failed queue job logging so you      
  | can control which database and table are used to store the jobs that      
  | have failed. You may change them to any database / table you wish.      
  |      
  */      
  
  'failed' => [      
    'database' => env('DB_CONNECTION', 'mysql'),      
    'table' => 'failed_jobs',      
  ],      
  
];

在connections中,我們看到sync這個連接。sync是Laravel默認的隊列,代表的就是synchronous,即同步隊列。

今天我們要來看一下,如何使用database,即數據庫來實現異步任務處理。

要使用database來作為隊列的內部實現機制,我們需要建立一張用于儲存Jobs的表:

$ php artisan queue:table     
$ php artisan migrate

以上命令將會在數據庫創建名為jobs的表。

隊列我們有了,那么現在我們來看一下Jobs。Laravel中jobs文件默認位置在app/Jobs文件夾下,我們可以通過make:job這個Artisan命令快速創建我們的job類:

$ php artisan make:job SendEmail

生成的job會實現Illuminate\Contracts\Queue\ShouldQueue這個接口,表明生成的job對象將被推到隊列中進行異步處理。

job類其實很簡單,里面只有一個名為handle的方法,該方法在job被queue處理的時候自動被調用。

在上面的命令中,我們創建了一個名為SendEmail的類:

?php    
  
namespace App\Jobs;    
  
use App\Email;    
use Illuminate\Bus\Queueable;    
use Illuminate\Queue\SerializesModels;    
use Illuminate\Queue\InteractsWithQueue;    
use Illuminate\Contracts\Queue\ShouldQueue;    
use Illuminate\Foundation\Bus\Dispatchable;    
  
class SendEmail implements ShouldQueue    
{    
  use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;    
  
  protected $email;    
  
  /**    
   * Create a new job instance.    
   *    
   * @param Podcast $podcast    
   * @return void    
   */    
  public function __construct(Email $email)    
  {    
    $this->email = $email;    
  }    
  
  /**    
   * Execute the job.    
   *    
   * @param AudioProcessor $processor    
   * @return void    
   */    
  public function handle()    
  {    
    // Process email and send the email to recipient(s)    
    // 這里我們可以處理我們的郵件并將郵件發送至接收人 
  }    
}

可以看到,我們可以將model傳遞進job的constructor中。Laravel會自動序列化(Serialize)模型的識別信息,在job真正被處理的時候,完整的模型數據才會被從數據庫調用出來。另外,在handle方法中,我們也可以注入我們的依賴dependencies。

好了,現在我們有了job類,可以創建job對象了,那么如何把job添加進隊列呢?

在我們的控制器中,我們可以調用job的dispatch方法來將其添加進隊列中:

?php  
  
namespace App\Http\Controllers;  
  
use App\Jobs\SendEmail;  
use Illuminate\Http\Request;  
use App\Http\Controllers\Controller;  
use App\Email; 
  
class EmailsController extends Controller  
{  
  /**  
   * Store a new email.  
   *  
   * @param Request $request  
   * @return Response  
   */  
  public function send(Request $request)  
  {  
    // Create email...  
    // 這里我們提取email信息并創建$email, Email是我們自定義的Model 
    $email = Email::create($request->only('sender', 'to', 'content')); 
  
    SendEmail::dispatch($email);  
  }  
}

這樣一來,每當我們的控制器調用send方法時,就會創建一個SendEmail的job在數據庫中。

那么怎么樣調用Queue Worker來處理我們的jobs呢?

在.env文件中,我們將QUEUE_DRIVER=sync改為QUEUE_DRIVER=database。

接下來,我們運行以下Artisan命令:

$ php artisan queue:work

隊列的worker會一直運行,每當有任務被添加進數據庫jobs表中,worker便會自動抓取出任務進行處理。當任務失敗時,worker會重復執行任務,直至最大嘗試次數(默認為255)。我們可以手動設置最大嘗試次數:

$ php artisan queue:work --tries=3

當然,我們也可以手動設置任務的超時(默認90s,在config/queue.php中的retry_after設置):

$ php artisan queue:work --timeout=30

最后,當沒有任務的時候,我們可以設置一個睡眠時間,當worker在睡眠時間時,將不會處理任務:

$ php artisan queue:work --sleep=10

上面的命令意思是每當worker處理完所有任務后,會睡眠10s,然后才會再次檢查任務隊列

本文使用Laravel 5.6進行講解

本文主要講解了Laravel框架中隊列和工作(Queues、Jobs)操作實例詳解,更多關于Laravel框架的使用技巧請查看下面的相關鏈接

您可能感興趣的文章:
  • laravel5.6 框架郵件隊列database驅動簡單demo示例
  • Laravel使用Queue隊列的技巧匯總
  • Docker部署Laravel應用實現隊列&任務調度
  • Laravel 6 將新增為指定隊列任務設置中間件的功能
  • Laravel 隊列使用的實現
  • Laravel框架隊列原理與用法分析
  • Laravel中為什么不使用blpop取隊列詳析
  • 關于 Laravel Redis 多個進程同時取隊列問題詳解
  • 源碼分析 Laravel 重復執行同一個隊列任務的原因
  • Laravel使用消息隊列需要注意的一些問題
  • Laravel中利用隊列發送郵件的方法示例
  • 淺談Laravel隊列實現原理解決問題記錄
  • 淺析Laravel5中隊列的配置及使用
  • PHP的Laravel框架中使用消息隊列queue及異步隊列的方法
  • Laravel 4.2 中隊列服務(queue)使用感受

標簽:黃山 唐山 隴南 河南 南通 武漢 平頂山 通遼

巨人網絡通訊聲明:本文標題《Laravel框架中隊列和工作(Queues、Jobs)操作實例詳解》,本文關鍵詞  Laravel,框架,中,隊列,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Laravel框架中隊列和工作(Queues、Jobs)操作實例詳解》相關的同類信息!
  • 本頁收集關于Laravel框架中隊列和工作(Queues、Jobs)操作實例詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲福利视频一区二区| 成人欧美一区二区三区1314| 欧美aa在线视频| 国产精品天天看| 欧美电影免费观看高清完整版在线 | 51精品国自产在线| 国产成人超碰人人澡人人澡| 亚洲色图色小说| 久久亚洲一区二区三区四区| 欧美精品第1页| 久久精品在这里| 91亚洲精品乱码久久久久久蜜桃| 国产在线一区二区| 日韩成人一级片| 日韩av不卡一区二区| 五月婷婷另类国产| 日韩精品每日更新| 日本欧美加勒比视频| 蜜臀av在线播放一区二区三区| 日本亚洲欧美天堂免费| 毛片av中文字幕一区二区| 紧缚奴在线一区二区三区| 国产乱子伦视频一区二区三区| 国内久久婷婷综合| va亚洲va日韩不卡在线观看| 91色|porny| 欧美亚洲愉拍一区二区| 欧美精品丝袜久久久中文字幕| 欧美刺激脚交jootjob| 国产亲近乱来精品视频| 中文字幕一区在线| 午夜精品一区二区三区三上悠亚| 青青国产91久久久久久| 国产福利一区二区三区在线视频| 成人动漫一区二区| 欧美日韩日日骚| xnxx国产精品| 亚洲激情综合网| 日本人妖一区二区| 国产精品系列在线观看| 91九色最新地址| 日韩视频一区二区三区| 中文字幕 久热精品 视频在线| 一区二区免费看| 麻豆精品国产91久久久久久| 成人激情黄色小说| 91精品国产综合久久香蕉的特点| 国产欧美日韩在线| 日韩精品成人一区二区在线| 国产不卡免费视频| 欧美三级三级三级| 欧美国产精品专区| 奇米精品一区二区三区在线观看| 99久久精品免费看国产| 欧美一级片在线| 中文字幕一区二区三区av| 日韩福利电影在线| 一本大道综合伊人精品热热| 欧美成人aa大片| 午夜伊人狠狠久久| a级精品国产片在线观看| 亚洲免费观看在线视频| 久久99国产精品尤物| 欧美偷拍一区二区| 综合久久久久久久| 国产福利视频一区二区三区| 337p亚洲精品色噜噜| 亚洲欧美视频一区| 麻豆国产精品官网| 91久久香蕉国产日韩欧美9色| 久久精品一二三| 久久精品噜噜噜成人av农村| 精品视频123区在线观看| 国产精品久久久久久久久果冻传媒 | 欧美亚洲动漫精品| 亚洲国产经典视频| 国产乱码一区二区三区| 91精品国产综合久久久久久漫画 | 一区二区在线观看视频| 成人av午夜影院| 日本一区二区三区高清不卡| 国内精品久久久久影院色| 91精品国产色综合久久久蜜香臀| 亚洲综合成人网| 在线看日韩精品电影| 亚洲精品高清在线| 色综合久久中文字幕| 亚洲图片另类小说| av成人免费在线观看| 中文字幕一区二区三区蜜月| 成人精品视频一区| 欧美韩国日本不卡| 国产成人鲁色资源国产91色综| 2020国产成人综合网| 国产福利一区二区三区| 久久九九久久九九| 国产乱子轮精品视频| 国产亚洲午夜高清国产拍精品 | 欧美一区二区在线播放| 视频一区二区三区中文字幕| 91麻豆精品国产91久久久久| 人人狠狠综合久久亚洲| 日韩色视频在线观看| 51精品秘密在线观看| 亚洲成人精品影院| 欧美女孩性生活视频| 免费久久99精品国产| 26uuu久久综合| www.亚洲激情.com| 午夜精品一区在线观看| 日韩精品在线一区二区| 国产经典欧美精品| 亚洲靠逼com| 91精品免费观看| 国产91在线看| 亚洲chinese男男1069| 欧美一区二区精品久久911| 国内精品久久久久影院色| 国产精品久久久久久久久晋中| 成人h版在线观看| 日韩专区在线视频| 久久九九久精品国产免费直播| 97国产一区二区| 日日噜噜夜夜狠狠视频欧美人| 久久综合九色综合97_久久久| 99久久精品免费精品国产| 性做久久久久久免费观看欧美| 久久午夜羞羞影院免费观看| 在线视频综合导航| 国产精品影音先锋| 亚洲综合精品久久| 国产午夜亚洲精品羞羞网站| 91传媒视频在线播放| 国产精品一区二区男女羞羞无遮挡| 亚洲欧美日韩国产综合在线| 日韩写真欧美这视频| eeuss鲁一区二区三区| 老汉av免费一区二区三区| 亚洲欧洲国产日韩| 久久久精品一品道一区| 欧美性xxxxxxxx| 99热精品国产| 国产一区二区在线免费观看| 一区二区三区四区激情| 欧美成人性福生活免费看| 91免费在线视频观看| 狠狠网亚洲精品| 视频一区二区中文字幕| 国产精品久久一级| 欧美日韩的一区二区| 国产成人亚洲精品狼色在线| 免费成人av资源网| 一区二区三区四区国产精品| 国产精品麻豆久久久| 欧美精品一区二区三区很污很色的 | 色噜噜狠狠一区二区三区果冻| 蜜桃av噜噜一区| 亚洲一区二区三区小说| 日本一区二区免费在线| 欧美一区二区三区视频免费 | 在线观看视频一区二区 | 亚洲一区av在线| 中文字幕视频一区二区三区久| 日韩精品专区在线影院重磅| 欧美一级高清大全免费观看| 99久久99久久综合| 国产成人精品亚洲777人妖| 国产乱人伦偷精品视频不卡 | 国产不卡在线一区| 国产毛片精品国产一区二区三区| 日韩和的一区二区| 亚洲麻豆国产自偷在线| 亚洲丝袜美腿综合| 国产欧美日本一区二区三区| 久久色在线视频| 91精品国产91久久综合桃花| 91精品国产aⅴ一区二区| 91精品国产综合久久精品app| 精品视频1区2区| 欧美色图12p| 欧美久久久久久蜜桃| 欧美日韩小视频| 在线成人av网站| 欧美大片一区二区| 日韩一区二区不卡| 欧美刺激午夜性久久久久久久| 欧美成人国产一区二区| 精品国产一区二区三区av性色| 国产成人h网站| 福利电影一区二区三区| 丰满白嫩尤物一区二区| 成人激情免费电影网址| 色综合视频一区二区三区高清| 欧美在线一二三四区| 欧美日韩国产综合视频在线观看 | 欧美亚洲愉拍一区二区| 日韩一区二区电影在线| 国产亚洲欧洲997久久综合| 亚洲美女屁股眼交| 老司机免费视频一区二区|