相關筆記:
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 任務超時重發 消費者必須在指定時間內處理任務,如果...