PHP操作Beanstalkd佇列(2)生產者與消費者

海島發表於2018-05-19

PHP操作Beanstalkd佇列(1)安裝與基礎

再瞭解 Beanstalkd 的基本概念和使用方法,併成功安裝後,可以進入實戰環節

二話不說,執行我們 Beanstalkd 後,先建立demo.php檔案,並使用 composer 引入 pda/pheanstalk 操作類

    require './vendor/autoload.php'; 
    $p = new \Pheanstalk\Pheanstalk('127.0.0.1',11300); 
複製程式碼

使用生產者 putInTube 方法向佇列新增任務

#引數順序為1.管道名 2.內容 3.優先順序 4.延遲秒數 5.超時時間秒速 超時重發(預設60s)
#向 newUsers 管道 新增內容為 text 優先順序為1000 延遲20s 操作時間為30s的任務
$p->putInTube('newUsers','text',1000,20,30);
複製程式碼

使用生產者 put 方法向佇列新增任務

#與 putInTube 方法不同,先選擇了管道,在新增任務,引數與 putInTube 相同
$tube = $p->useTube('newUsers')
$tube->put('text1',1000);
$tube->put('text2',1000);
複製程式碼

使用消費者方法獲取管道資訊

#watch()監聽管道
#reserve()獲取任務,無法讀取bury狀態任務,是阻塞方法,無任務時程式會一直阻塞,直到有新任務出現,可以新增阻塞時間,單位s,如reserve(2)
$job = $p->watch('newUsers')->reserve();
$job->getData(); #獲取任務內容
~ #執行處理邏輯
$p->delete() #刪除任務 
複製程式碼

若處理邏輯時間過長,任務將會被重新放回管道中,可以用 touch 方法延遲處理時間

$job = $p->watch('newUsers')->reserve();
$p->touch($job);
複製程式碼

當這個任務不符合處理要求時,可以用 release 方法將它放回管道,重設為 ready 狀態

$job = $p->watch('newUsers')->reserve();
$p->release($job);
複製程式碼

如果此任務是當前不處理任務,可以使用 bury 方法將它改為預留任務,放置一旁

$job = $p->watch('newUsers')->reserve();
$p->bury($job);

#讀取預留任務
$job = $p->peekBuried('newUsers');
#將任務變回ready狀態
$p->kickJob($job);

#批量處理預留任務 將id小於999的任務都變成ready狀態
$p->useTube('newUsers')->kick(999);
複製程式碼

只獲取對應狀態的任務 peek

#獲取ready狀態任務
$job = $p->peekReady('newUsers');
#讀取Delayed狀態任務
$p->peekDelayed('newUsers');
複製程式碼

reserve是阻塞的 peek是沒阻塞,當獲取不到任務將丟擲異常

#同時監聽多個管道
$p->watch('newUsers')->watch('default');
#被監聽的管道
$p->listTubesWatched();
#不監聽此管道
$p->ignore('default')
複製程式碼
#給管道設定延遲
$p->pauseTube('newUsers',100);
#取消延遲
$p->resumeTube('newUsers');
複製程式碼

相關文章