คลาสที่ช่วยเรียงลำดับการทำงานของฟังก์ชันต่างๆ
Laravel Queue เตรียมฟังก์ชันที่ใช้ในการเข้าถึง api ของเว็บที่ให้บริการคิวไว้ การคิวคือการเรียงลำดับงานของเว็บไซต์ เช่น เรามีเมล์ที่ต้องส่งถึง 1000 ฉบับถ้าส่งแบบเดิม server อาจจะรับไม่ไหว เราจึงมีคลาส queue มาเพื่อการนี้ครับ
ไฟล์ที่ใช้ตั้งค่าเก็บไว้ที่ app/config/queue.php
. ในไฟล์จะมีข้อมูลที่เราต้องใช้ในการเชื่อมต่อผู้ให้บริการคิว เช่น Beanstalkd, IronMQ, Amazon SQS, and synchronous (สำหรับการทดสอบในเครื่อง)
ชื่อคลาสของผู้ให้บริการคิวที่เราจะป้อนเข้าไป:
- Beanstalkd:
pda/pheanstalk
- Amazon SQS:
aws/aws-sdk-php
- IronMQ:
iron-io/iron_mq
ในการส่งงานใหม่เข้าไปในคิวเราใช้ฟังก์ชัน Queue::push
Pushing A Job Onto The Queue
Queue::push('SendEmail', array('message' => $message));
พารามิเตอร์ตัวแรกเป็น ฟัง์ชันที่เราใช้ควบคุมคิวนี้. ตัวที่สองเป็นข้อมูลที่เราจะทำการคิว
ตัวอย่างฟังก์ชันที่ใช้ควบคุมการคิว
class SendEmail {
public function fire($job, $data)
{
//
}
}
ฟังก์ชันfire
รับพารามิเตอร์ Job
ตัวที่สองคือข้อมูล data
ที่จะส่งลงคิว
ถ้าเราไม่ใช่เมทอด fire
เราสามารถกำหนดได้ตามตัวอย่างครับ
เปลี่ยนจาก fire เป็น Push
Queue::push('SendEmail@send', array('message' => $message));
เมื่อมีการทำงานไปเเล้วเราก็ต้องลบข้อมูลออกไปโดยใช้เมทอด delete
เพื่อลบ Job
instance:
ตัวอย่างการลบ
public function fire($job, $data)
{
// Process the job...
$job->delete();
}
ถ้าเราต้องการเอางานที่ทำไปกลับมาเข้าคิวอีกครั้งก็ใช้เมทอด release
ครับ
ตัวอย่าง
public function fire($job, $data)
{
// Process the job...
$job->release();
}
เราสามารถกำหนดเวลาที่จะหน่วงไว้ก่อนที่จะสั่งให้งานต่อไปทำงานได้แบบนี้ครับ
$job->release(5);
เมื่องานที่เข้าคิวเกิดข้อผิดพลาดขึ้น จะถูกนำกลับไปต่อคิวใหม่ เราสามารถตรวจสอบการทำงานใหม่ได้โดยฟังก์ชัน attempts
ตรวจหางานที่มีการพยายามทำมากกว่า 3 ครั้ง
if ($job->attempts() > 3)
{
//
}
การเรียกข้อมูลของาน
$job->getJobId();
เราสามารถใช้งานฟังก์ชันที่ไม่มีชื่อในการสร้างงานได้โดยตัวอย่างเลยครับ
Queue::push(function($job) use ($id)
{
Account::delete($id);
$job->delete();
});
หมายเหตุ: เมื่อใช้ฟังก์ชันที่ไม่มีชื่อกับ queue ตัวแปร
__DIR__
และ__FILE__
จะไม่สามารถใช้งานได้
ถ้าใช้บริการของ Iron.io push queues, ควรจะไม่ใช้งานฟังก์ชันที่ไม่มีชื่อในเมล์. จะมีการตรวจสอบคำร้องว่าส่งมาจาก Iron.io.จริงหรือไม่ ตัวอย่าง https://yourapp.com/queue/receive?token=SecretToken
.ควรทำการตรวจสอบค่า secrettoken ก่อนทำการคิว.
Laravel เตรียมคำสั่งqueue:listen
เพื่อรอรับคำขอที่มากจากผู้ให้บริการ
ตัวอย่างการใช้งาน
php artisan queue:listen
เราสามารถกำหนดค่าการเชื่อมต่อเสริมลงไปได้:
php artisan queue:listen connection
เราสามารถใช้โปรแกรม Supervisor เพื่อตรวจสอบว่าคำสั่ง queue listener ยังทำงานอยู่ไหม
สามารถตั้งค่าเวลาที่จะอนุญาตุให้เกิดทำงานขึ้นได้
ตัวอย่างการหน่วงเวลา
php artisan queue:listen --timeout=60
สั่งให้งานชิ้นแรกที่อยู่บนคิวทำงาน
php artisan queue:work
Push queues คือการโยนภาระการรอรับคิวจากที่ทำบนเครื่องขิงเรา เปลี่ยนไปให้ผู้บริการทำแทน ซึ่งมี Iron.io เจ้าเดียวที่สนับสนุน. ก่อนอื่นเราต้องไปสมัครบริการของ Ironio ก่อน, แล้วนำข้อมูลการเชื่อมต่อมาใส่ไว้ที่ app/config/queue.php
ต่อมาก็ใช้คำสั่ง Artisan queue:subscribe
เพื่อลงทะเบียนคิวไว้กับ Iron.io:
ตัวอย่าง
php artisan queue:subscribe queue_name http://foo.com/queue/receive
ตอนนี้ ถ้าเราไปดูที่หน้าแสดงผลคิวที่ Iron.io , ก็จะเห็นรายการคิว และรายชื่อลิ้งที่เราจะสั่งให้ทำงาน. เราสามารถลงทะเบียนไว้ทีละหลายๆลิ้งก็ได้.ต่อมาเราต้องมาสร้าง route เพื่อรับคำร้องขอของ Iron.io โดยชื่อ route จะเป็น queue/receive
และส่งค่ากลับไปด้วยฟังก์ชัน Queue::marshal
Route::post('queue/receive', function()
{
return Queue::marshal();
});
เมทอด marshal
จะดูแลการทำงานของคิวให้