PHP使用Beanstalkd例項

2021-09-19 19:58:58 字數 3153 閱讀 6297

相關筆記:

beanstalkd訊息/任務佇列

centos編譯和yum安裝beanstalkd及service和systemctl管理

composer在windows和linux的安裝和使用

有關beanstalkd的基本概念,編譯和yum的安裝方法已經在上述筆記中記錄了,今天練習下php使用beanstalkd的過程,我選擇的是使用pheanstalk類來連線beanstalkd

composer require pda/pheanstalk
php檢視beanstalkd狀態指令碼status.php

<?php

/** * created by phpstorm.

* user: jmsite.cn

* date: 2019/1/21

* time: 10:32

*/require "../vendor/autoload.php";

use pheanstalk\pheanstalk;

$pheanstalk = new pheanstalk('192.168.75.135',11300);

print_r($pheanstalk->stats());

生產者**producter.php

<?php

/** * created by phpstorm.

* user: jmsite.cn

* date: 2019/1/20

* time: 16:30

*/require "../vendor/autoload.php";

use pheanstalk\pheanstalk;

$pheanstalk = new pheanstalk('192.168.75.135',11300);

for ($i=0;$i<50;$i++)

消費者**consumer.php

<?php

/** * created by phpstorm.

* user: jmsite.cn

* date: 2019/1/20

* time: 16:31

*/set_time_limit(0);

ini_set('default_socket_timeout', 900);

require "../vendor/autoload.php";

use pheanstalk\pheanstalk;

$pheanstalk = new pheanstalk('192.168.75.135',11300);

while (true)

}

開啟命令列/終端視窗,執行生產者,會向tube寫入50條任務

ps e:\repository\work\beanstalk> php .\producter.php

int(101)

int(102)

int(103)

int(104)

int(105)

int(106)

int(107)

int(108)

int(109)

int(110)

int(111)

int(112)

int(113)

int(114)

......

由此可見,$pheanstalk->putintube成功後返回的是job的id

檢視狀態

ps e:\repository\work\beanstalk> php status.php

pheanstalk\response\arrayresponse object

( [_name:pheanstalk\response\arrayresponse:private] => ok

[storage:arrayobject:private] => array

([current-jobs-urgent] => 0

[current-jobs-ready] => 50

[current-jobs-reserved] => 0

[current-jobs-delayed] => 0

[current-jobs-buried] => 0

......

結果中顯示處於ready待讀取狀態的job是50個

開啟兩個或以上命令列/終端視窗,執行消費者,模擬多消費者競爭

消費者1

ps e:\repository\work\beanstalk> php .\consumer.php

消費者2

ps e:\repository\work\beanstalk> php .\consumer.php

兩個消費者競爭著完成了全部任務,由於我的beanstalkd啟動時開啟了binlog持久,所以beanstalkd重啟後任務也不會丟失

1.建立job時,設定的超時時間pheanstalk::default_ttr一定要比消費者處理乙個job的時間要長,否則job在超時之後會被tube更改為ready狀態,被其他消費者獲取,而此時當前消費者還在處理該job,這就出現了乙個job被多個消費者重複執行的可怕現象

2.pheanstalk的維護者發生了變化,在新版的pheanstalk中是不支援長連線的,當客戶端socket連線伺服器時間超過php.ini中設定的default_socket_timeout時,如果未能從服務端tube獲得job,連線將會被斷開,所以消費者程序需要維護,以便在退出後可以重新開啟程序,推薦使用supervisord維護消費者程序。

判斷socket超時的**

public function getline($length = null)

if (($data === false) && microtime(true) - $timer > $timeout)

} while ($data === false);

return rtrim($data);

}

beanstalkd基礎使用(C C 語言)

保證linux下已有beanstalkd環境,在beanstalkd目錄下.beanstalkd f執行程式 sudo make install在 etc ld.so.conf目錄下新增解壓後的目錄,如 home beanstalk client master 2.進入目錄下的examples目錄,...

beanstalkd訊息佇列

簡介 beanstalkd,乙個高效能 輕量級的分布式記憶體佇列系統,最初設計的目的是想通過後台非同步執行耗時的任務來降低高容量web應用系統的頁面訪問延遲,支援過有9.5 million使用者的facebook causes應用。後來開源,現在有postrank大規模部署和使用,每天處理百萬級任務...

Beanstalkd訊息佇列介紹

beanstalkd是乙個高效能,輕量級的分布式記憶體佇列 1 支援優先順序 支援任務插隊 2 延遲 實現定時任務 3 持久化 定時把記憶體中的資料刷到binlog日誌 4 預留 把任務設定成預留,消費者無法取出任務,等某個合適時機再拿出來處理 5 任務超時重發 消費者必須在指定時間內處理任務,如果...