ส่วนของไฟล์ที่จะสร้างมีดังต่อไปนี้ ซึ่งการสร้าง Queue นี้จะอธิบายในส่วนของการทำงานแบบเก็บคำสั่งไว้ใน Database ก่อนที่จะส่งคำสั่งไปทำงาน
- Route
- ในส่วนของ Route ไม่ต้องสร้างใหม่ให้ใช้ Route ที่ติดมากับ Framework อยู่แล้ว แต่ให้ทำการแก้ไข Route เพื่อชี้ไปยัง Controller ที่สร้างขึ้นมานั้นเอง จะเห็นได้ว่า ในส่วนของ Route จะเป็นต้นทางการนำเข้าข้อมูลเพื่อจะส่งคำสั่งไปให้ Controller ทำงานนั้นหมายความว่า Route เป็นส่วน Input นั่นเอง
- Path ของไฟล์ Route อยู่ที่ App\Http\routes.php
- Controller
- คำสั่งสร้าง Controller ผ่านทาง Astisan โดยรันผ่าน Commandline ดังต่อไปนี้
- php artisan make:controller QueueJobs
- เมื่อทำการ Run คำสั่งเสร็จแล้วระบบจะทำการสร้างไฟล์ Controller ให้โดยอัตโนมัติ โดยจะใช้ชื่อ Controllers นั้นว่า QueueJobs ซึ่งเราสามารถเปลี่ยนชื่อไฟล์ได้ผ่าน Conmandline ช่วงที่เราพิมพ์คำสั่งสร้างมันนั้นเอง
- Path ของไฟล์ Controller จะถูกนำไปเก็บไว้ที่ App\Http\Controllers\QueueJosb.php
- QueueJob
- คำสั่งสร้าง QueueJobs ผ่านทาง Astisan โดยรันผ่าน Commandline ดังต่อไปนี้
- php artisan make:job QueueJobs
- เมื่อทำการ Run คำสั่งเสร็จแล้วระบบจะทำการสร้างไฟล์ QueueJobs ให้โดยอัตโนมัติ โดยจะใช้ชื่อ QueueJobs นั้นตามที่พิมพ์เข้ามา ซึ่งเราสามารถเปลี่ยนชื่อไฟล์ได้ผ่าน Conmandline ช่วงที่เราพิมพ์คำสั่งสร้างมันนั้นเอง
- Path ของไฟล์ Controller จะถูกนำไปเก็บไว้ที่ App\Jobs\QueueJosb.php
- 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
- 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 เพียงเท่านั้นก็สามารถใช้งานการเก็บข้อมูลประเภทอื่น ๆได้ ซึ่งประเภททั้งหมดได้เขียนรวบรวมไว้ในบทความที่แล้วสามารถหาอ่านได้
ในส่วนของไฟล์การทำงานจริง
- route
Route::get('/queue-jobs', [ 'uses' => 'QueueJobs@index', 'as' => 'get.queue.index', ]);
- 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)); } } }
- 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 | +----+-------------+----------+-------------+--------------+------------+
- 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); } }
- 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
- 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
0 ความคิดเห็น:
แสดงความคิดเห็น