一.基本
Beanstalkd,一個高性能、輕量級的分布式內存隊列系統,最初設計的目的是想通過后台異步執行耗時的任務來降低高容量Web應用系統的頁面訪問延遲,支持過有9.5 million用戶的Facebook Causes應用。后來開源,現在有PostRank大規模部署和使用,每天處理百萬級任務。Beanstalkd是典型的類Memcached設計,協議和使用方式都是同樣的風格,所以使用過memcached的用戶會覺得Beanstalkd似曾相識。
二.服務端
1.https://github.com/kr/beanstalkd/downloads
下載最新版1.8
2.下載后解壓,直接進入目錄執行,make install --prefix=/usr/local/bin/
3.啟動服務端
/usr/local/bin/beanstalkd -l 0.0.0.0 -p 11300 -z 67108864 -b /var/lib/beanstalkd -F &
-b /var/lib/beanstalkd
表示在此目錄下建立binlog日志,便於啟動的時候恢復未處理完的數據
作為服務啟動需要借助supervisor(點擊查看)
三.php客戶端
1.下載https://github.com/davidpersson/queue/tree/master/libs/beanstalk/src/Socket下的Beanstalk.php文件
2.發送任務:
<?php //發送任務 require_once 'Beanstalk.php'; //實例化beanstalk $beanstalk = new Socket_Beanstalk(array( 'persistent' => false, //是否長連接 'host' => '127.0.0.1', 'port' => 11300, //端口號默認11300 'timeout' => 3 //連接超時時間 )); if (!$beanstalk->connect()) { exit(current($beanstalk->errors())); } //選擇使用的tube $beanstalk->useTube('test'); //往tube中增加數據 $put = $beanstalk->put( 23, // 任務的優先級. 0, // 不等待直接放到ready隊列中. 60, // 處理任務的時間. 'hello, beanstalk' // 任務內容 ); if (!$put) { exit('commit job fail'); } $beanstalk->disconnect();
3.處理任務
<?php require_once 'src/Socket/Beanstalk.php'; //實例化beanstalk $beanstalk = new Socket_Beanstalk(array( 'persistent' => false, //是否長連接 'host' => '127.0.0.1', 'port' => 11300, //端口號默認11300 'timeout' => 3 //連接超時時間 )); if (!$beanstalk->connect()) { exit(current($beanstalk->errors())); } //查看beanstalkd狀態 //var_dump($beanstalk->stats()); //查看有多少個tube //var_dump($beanstalk->listTubes()); $beanstalk->useTube('test'); //設置要監聽的tube $beanstalk->watch('test'); //取消對默認tube的監聽,可以省略 $beanstalk->ignore('default'); //查看監聽的tube列表 //var_dump($beanstalk->listTubesWatched()); //查看test的tube當前的狀態 //var_dump($beanstalk->statsTube('test')); while (true) { //獲取任務,此為阻塞獲取,直到獲取有用的任務為止 $job = $beanstalk->reserve(); //返回格式array('id' => 123, 'body' => 'hello, beanstalk') if( $job ){ $res = $job['body']; do($res);//處理任務 $beanstalk->delete( $job['id'] ); usleep(100000); }else{ sleep(1); } sleep(1); } $beanstalk->disconnect();
四.不足之處
無法刪除tube,只要曾經設置過tube,就一直存在,即便挨個刪除job也不行,不知道是不是我的方法不對.
五.注意
beanstalk的reserve方法為阻塞獲取,如果在將其放入web中,則會造成一直阻塞,導致客戶端失去響應,需要重啟web server.所以不要在web中獲取任務或處理任務.
六.beanstalk管理工具
beanstalk管理工具暫未涉及.