[Laravel 5 easy make queue with laravel สร้าง queue อย่างง่ายด้วย Laravel 5]

หลังจากที่พูดถึงเรื่อง Queue ไปในบทความที่แล้ววันนี้ก็จะมาต่อด้วยวิธีการสร้างอย่างง่าย เอาล่ะมาเริ่มกันเลย หากยังไม่ได้ทำการติดตั้ง Laravel ก็ทำการติดตั้งให้เรียบร้อย แนะนำให้ create project ขึ้นมาใหม่เลย


ส่วนของไฟล์ที่จะสร้างมีดังต่อไปนี้ ซึ่งการสร้าง Queue นี้จะอธิบายในส่วนของการทำงานแบบเก็บคำสั่งไว้ใน Database ก่อนที่จะส่งคำสั่งไปทำงาน

  1. Route
    • ในส่วนของ Route ไม่ต้องสร้างใหม่ให้ใช้ Route ที่ติดมากับ Framework อยู่แล้ว แต่ให้ทำการแก้ไข   Route เพื่อชี้ไปยัง Controller ที่สร้างขึ้นมานั้นเอง จะเห็นได้ว่า ในส่วนของ Route จะเป็นต้นทางการนำเข้าข้อมูลเพื่อจะส่งคำสั่งไปให้ Controller ทำงานนั้นหมายความว่า Route เป็นส่วน Input นั่นเอง 
    • Path ของไฟล์ Route อยู่ที่ App\Http\routes.php
  2. Controller
    • คำสั่งสร้าง Controller ผ่านทาง Astisan โดยรันผ่าน Commandline ดังต่อไปนี้
      • php artisan make:controller QueueJobs
    • เมื่อทำการ Run คำสั่งเสร็จแล้วระบบจะทำการสร้างไฟล์  Controller ให้โดยอัตโนมัติ โดยจะใช้ชื่อ Controllers นั้นว่า QueueJobs ซึ่งเราสามารถเปลี่ยนชื่อไฟล์ได้ผ่าน Conmandline ช่วงที่เราพิมพ์คำสั่งสร้างมันนั้นเอง 
    • Path ของไฟล์ Controller จะถูกนำไปเก็บไว้ที่ App\Http\Controllers\QueueJosb.php
  3. QueueJob
    • คำสั่งสร้าง QueueJobs ผ่านทาง Astisan โดยรันผ่าน Commandline ดังต่อไปนี้
      • php artisan make:job QueueJobs
    • เมื่อทำการ Run คำสั่งเสร็จแล้วระบบจะทำการสร้างไฟล์  QueueJobs ให้โดยอัตโนมัติ โดยจะใช้ชื่อ QueueJobs นั้นตามที่พิมพ์เข้ามา ซึ่งเราสามารถเปลี่ยนชื่อไฟล์ได้ผ่าน Conmandline ช่วงที่เราพิมพ์คำสั่งสร้างมันนั้นเอง 
    • Path ของไฟล์ Controller จะถูกนำไปเก็บไว้ที่ App\Jobs\QueueJosb.php
  4. Database
    • คำสั่งสร้าง Table ผ่านทาง Astisan โดยรันผ่าน Commandline ดังต่อไปนี้
      • php artisan queue:table  [create migration file]
      • php artisan migrate [Execute command create table by migration file]
    • เมื่อรัน คำสั่งเหล่านี้เสร็ดแล้วให้กลับไปดูที่ Dadatabase หากไม่มี Error อะไรในขณะที่รันคำสั่งก็จะพบว่ามีตาราง 1 ตารางเพิ่มเข้ามาในระบบ ชื่อว่า Jobs 
  5. ENV
    • ในส่วนของ .ENV File นั้นมีจุดที่ต้องสนใจอยู่  2 จุดคือค่า config database และค่า config ระบบ Queue ซึ่งจะต้องทำการแก้ไขดังต่อไปนี้ 
    • Path ของไฟล์ อยู่ที่ root path ของโปรเจ็ค ซึ่งหากเป็น Osx จะไม่พบไฟล์ให้แก้ไขผ่านทาง VI text editor  อะไรก็ได้ เพื่อเข้าไปยังไฟล์ 
    • Config database 
      • DB_CONNECTION=mysql [Connection Type]
      • DB_HOST=localhost [Host database]
      • DB_PORT=3306 [Port]
      • DB_DATABASE=labs [Database name]
      • DB_PASSWORD=xxx [Database password]
    • Config Queue
      • QUEUE_DRIVER=database [Other Type,Sync ...]
โครงสร้างทั้งหมดของระบบการทำงานของ Queue ก็จะมีประมาณนี้ยังไม่นับรวมในส่วนของ การใช้งานการเก็บข้อมูลประเภทอื่น ณ ที่นี้จะขอยกตัวอย่าง Dadabase ซึ่งหากทำ Database ได้ในส่วนอื่น ๆ ก็ทำงานเหมือน ๆกันเพียงแค่เปลี่ยนค่า Config ใน .env ส่วนของ Config Queue เพียงเท่านั้นก็สามารถใช้งานการเก็บข้อมูลประเภทอื่น ๆได้ ซึ่งประเภททั้งหมดได้เขียนรวบรวมไว้ในบทความที่แล้วสามารถหาอ่านได้ 

ในส่วนของไฟล์การทำงานจริง
  1. route 
    • Route::get('/queue-jobs', [
          'uses' => 'QueueJobs@index',
          'as' => 'get.queue.index',
      ]);
  2. Controller
    • namespace App\Http\Controllers;
      
      use App\Jobs\QueueJosb;
      use Illuminate\Http\Request;
      
      class QueueJobs extends Controller
      {
          /**
           * [$requeust description]
           * @var [type]
           */
          private $requeust;
          /**
           * [__construct description]
           * @param Request $requeust [description]
           */
          public function __construct(Request $requeust)
          {
              $this->requeust = $requeust;
          }
      
          public function index()
          {
              /** @loop for push queue . */
              for ($i = 0; $i < 5; $i++) {
                  \Queue::pushOn('QueueJosb', new QueueJosb($this->requeust));
              }
          }
      
      }
      
      
  3. Database
    • +--------------+---------------------+------+-----+---------+----------------+
      | Field        | Type                | Null | Key | Default | Extra          |
      +--------------+---------------------+------+-----+---------+----------------+
      | id           | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
      | queue        | varchar(255)        | NO   | MUL | NULL    |                |
      | payload      | longtext            | NO   |     | NULL    |                |
      | attempts     | tinyint(3) unsigned | NO   |     | NULL    |                |
      | reserved     | tinyint(3) unsigned | NO   |     | NULL    |                |
      | reserved_at  | int(10) unsigned    | YES  |     | NULL    |                |
      | available_at | int(10) unsigned    | NO   |     | NULL    |                |
      | created_at   | int(10) unsigned    | NO   |     | NULL    |                |
      +--------------+---------------------+------+-----+---------+----------------+
      
    • กรณี Queue ทำงานปรกติ แล้วข้อมูลของ  Queue จะถูกเพิ่มเข้าไปใน  Database ดังตัวอย่าง
    • +----+-------------+----------+-------------+--------------+------------+
      | id | queue       | reserved | reserved_at | available_at | created_at |
      +----+-------------+----------+-------------+--------------+------------+
      | 13 | SendMailJob |        1 |  1464318498 |   1464318490 | 1464318490 |
      | 19 | SendMailJob |        1 |  1464318537 |   1464318513 | 1464318513 |
      | 20 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 21 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 22 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 23 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 24 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 25 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 26 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 27 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 28 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 29 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 30 | SendMailJob |        0 |        NULL |   1464318513 | 1464318513 |
      | 31 | SendMailJob |        0 |        NULL |   1464318514 | 1464318514 |
      | 32 | SendMailJob |        0 |        NULL |   1464318514 | 1464318514 |
      | 33 | SendMailJob |        0 |        NULL |   1464318514 | 1464318514 |
      | 34 | SendMailJob |        0 |        NULL |   1464318514 | 1464318514 |
      | 35 | SendMailJob |        0 |        NULL |   1464318514 | 1464318514 |
      | 36 | SendMailJob |        0 |        NULL |   1464318661 | 1464318661 |
      | 37 | SendMailJob |        0 |        NULL |   1464318661 | 1464318661 |
      | 38 | SendMailJob |        0 |        NULL |   1464318661 | 1464318661 |
      | 39 | SendMailJob |        0 |        NULL |   1464318661 | 1464318661 |
      | 40 | SendMailJob |        0 |        NULL |   1464318661 | 1464318661 |
      | 41 | SendMailJob |        0 |        NULL |   1464318662 | 1464318662 |
      | 42 | SendMailJob |        0 |        NULL |   1464318662 | 1464318662 |
      | 43 | SendMailJob |        0 |        NULL |   1464318662 | 1464318662 |
      | 44 | SendMailJob |        0 |        NULL |   1464318662 | 1464318662 |
      | 45 | SendMailJob |        0 |        NULL |   1464318662 | 1464318662 |
      +----+-------------+----------+-------------+--------------+------------+
      
  4. Queue 
    •  
      namespace App\Jobs;
      
      use App\Jobs\Job;
      use Illuminate\Contracts\Queue\ShouldQueue;
      use Illuminate\Queue\InteractsWithQueue;
      use Illuminate\Queue\SerializesModels;
      
      class QueueJosb extends Job implements ShouldQueue
      {
          use InteractsWithQueue, SerializesModels;
      
          /**
           * [$request description]
           * @var [type]
           */
          private $request;
      
          /**
           * Create a new job instance.
           *
           * @return void
           */
          public function __construct($request)
          {
              $this->request = $request;
          }
      
          /**
           * Execute the job.
           *
           * @return void
           */
          public function handle()
          {
              // do something ,call api ,insert database or something else business logic.
              dump('success');
              dump($this->request);
              sleep(1);
          }
      }
      
      
  5. ENV
    • APP_ENV=local
      APP_DEBUG=true
      APP_KEY=base64:4+FiIZ6vPXus84FCP4BHCFe2+KoMjX5LrHjDc8i3ECw=
      APP_URL=http://localhost
      
      DB_CONNECTION=mysql
      DB_HOST=127.0.0.1
      DB_PORT=3306
      DB_DATABASE=labs
      DB_USERNAME=root
      DB_PASSWORD=
      
      CACHE_DRIVER=file
      SESSION_DRIVER=file
      QUEUE_DRIVER=database
      
      REDIS_HOST=127.0.0.1
      REDIS_PASSWORD=null
      REDIS_PORT=6379
      
      MAIL_DRIVER=smtp
      MAIL_HOST=mailtrap.io
      MAIL_PORT=2525
      MAIL_USERNAME=null
      MAIL_PASSWORD=null
      MAIL_ENCRYPTION=null
      
  6. Execute
    •  หลังจากที่แก้ไขและสร้างไฟล์ข้างต้นเสร็จหมดแล้วให้ทำการ Run คำสั่งเพื่อรอรับ Queue ที่จะเข้ามา แล้วส่งต่อไปทำงานโดยมีคำสั่งดังนี้
    •  
      Samarks-Air:queue Samark$ php artisan queue:listen --queue=QueueJobs
      [2016-05-27 03:08:40] Processed: Illuminate\Queue\CallQueuedHandler@call
      [2016-05-27 03:08:44] Processed: Illuminate\Queue\CallQueuedHandler@call
      [2016-05-27 03:08:49] Processed: Illuminate\Queue\CallQueuedHandler@call
      [2016-05-27 03:08:53] Processed: Illuminate\Queue\CallQueuedHandler@call
      [2016-05-27 03:08:57] Processed: Illuminate\Queue\CallQueuedHandler@call
      
Share on Google Plus

About maxcom

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 ความคิดเห็น:

แสดงความคิดเห็น