消息队列Beanstalkd的安装使用、Php两种beanstalk扩展的安装方式及beanstalk扩展连接beanstalkd的php示例

一、消息队列beanstalkd的安装使用

1. memcache,redis

    很多东西都可以做队列使用,比如memcache,redis。redis里面有list队列数据结构,应该说凡是能实现数据存取的都能做队列,比如MYSQL也可以,不过这些都只能说是能实现队列的基本功能,即生产数据消费数据。而beanstalkd是一个专业做队列的产品。它是为队列而生,所以beanstalkd具有其它的产品没有的特点,比如对队列设置状态、任务优先级等。

2. 关于Beanstalkd

   Beanstalkd是一个轻量级消息队列中间件,它最大特点是将自己定位为基于管道  (tube) 和任务 (job) 的工作队列 (work-queue):Beanstalkd 支持任务优先级 (priority), 延时 (delay), 超时重发 (time-to-run) 和预留 (buried), 能够很好的支持分布式的后台任务和定时任务处理。它的内部实现采用 libevent, 服务器-客户端之间用类似 memcached 的轻量级通讯协议,具有有很高的性能。尽管是内存队列, beanstalkd 提供了 binlog 机制, 当重启 beanstalkd 时,当前任务状态能够从纪录的本地 binlog 中恢复。

3. Beanstalkd安装过程:

beanstalkd的github下载地址:https://github.com/kr/beanstalkd/releases 
beanstalkd的官网:http://thebeanstalk.co.za

wget https://github.com/kr/beanstalkd/archive/v1.10.tar.gz
mv v1.10.tar.gz beanstalkd-1.10.tar.gz
tar zxvf beanstalkd-1.10.tar.gz 
cd beanstalkd-1.10
make
make install PREFIX=/opt/modules/beanstalkd/ #指定安装路径

安装成功后会提示你安装到了你要安装的位置。

4. 安装成功后启动

进入安装路径可使用以下命令:

./beanstalkd -v #查看版本号
./beanstalkd -VVV  快速启动beanstalkd

上面的快速启动,未指定绑定的IP地址,建议使用-l参数指定绑定地址,另外-b指定binlog目录地址,还有-z等各参数。如下:

./beanstalkd -l 127.0.0.1 -p 11300 -b /opt/modules/beanstalkd/

启动时可带有参数如下:

[root@kermit bin]# ./beanstalkd -h
Use: ./beanstalkd [OPTIONS]
Options:
 -b DIR   wal directory
 -f MS    fsync at most once every MS milliseconds (use -f0 for "always fsync")
 -F       never fsync (default)
 -l ADDR  listen on address (default is 0.0.0.0)
 -p PORT  listen on port (default is 11300)
 -u USER  become user and group
 -z BYTES set the maximum job size in bytes (default is 65535)
 -s BYTES set the size of each wal file (default is 10485760)
            (will be rounded up to a multiple of 512 bytes)
 -c       compact the binlog (default)
 -n       do not compact the binlog
 -v       show version information
 -V       increase verbosity
 -h       show this help

     启动后对beanstalkd的操作可以使用telnet,比如telnet 127.0.0.1 11300.然后便可以执行beanstalkd的各命令,如stats查看信息,use,put,watch等等。

二、php两种beanstalk扩展的下载与安装

    php安装beanstalk扩展,安装扩展并不困难,不过安装beanstalk扩展需要弄清楚一点,如果是已有的程序部署环境,需要看看你的beanstalk用的是哪个扩展,之前我在安装的时候发现我安装的beanstalk扩展里没有addServer方法,而原来已经有的程序中却有addServer方法,所以看一下。

第一种:addserver方式

如果你的程序是这种连接方式:

$bsc = new Beanstalk();
$bsc->addserver("ip1", 11300);
$tubes = $bsc->list_tubes();

    则需要下载安装扩展: php的beanstalk扩展(addserver方式)下载   安装这种扩展时还需要安装libbeanstalkclient,下载地址:php的beanstalk扩展addserver方式时的libbeanstalkclient ,其github主页见:https://github.com/nil-zhang/php-beanstalk  。安装的过程在主页上也有。下面也标注一下:

#1.Install  libbeanstalkclient
$cd libbeanstalkclient/
$sudo mkdir m4
$sudo ./autogen.sh 
$sudo vim /etc/ld.so.conf
#在此文件下面加上此行:
/usr/lib
$sudo ldconfig

#2.Install php-beanstalk
$cd php-beanstalk
$phpize
$sudo ./configure  --with-php-config=/opt/modules/php/bin/php-config 
$sudo make
$sudo make install
#之后在php.ini文件里加上扩展 beanstalk.so

需要注意的是:1,安装libbeanstalkclient之前需要服务器已经安装libtool,命令:

yum -y install libtool,不然安装时你可能会遇到错误:

./autogen.sh: line 1: libtoolize: command not found
configure.ac:21: installing `./compile'
configure.ac:5: installing `./install-sh'
configure.ac:5: installing `./missing'
src/Makefile.am:3: Libtool library used but `LIBTOOL' is undefined

如果忽略了上面的错误,继续安装beanstalk,就会在安装beanstalk时遇见错误:

configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
checking for gawk... gawk
checking whether to enable beanstalk support... yes, shared
checking for libbeanstalkclient... yes, shared
configure: error: Can't find libbeanstalkclient headers under "/opt/modules/download/libbeanstalkclient"

第二种:connect方式

如果你的程序是下面这种连接beanstalk的方式,如下:

$bsc = new Beanstalk();
$bsc->connect("ip1", 11300);

    则需要下载php的beanstalk扩展:php的beanstalk扩展(connect方式) 也算其主页吧:http://git.oschina.net/qzfzz/php-beanstalk  这个安装不需要其它的支持。

第二种方法也可以不用安装扩展,有现成的PHP类文件,下载见本文关联的资源。

三、php安装beanstalk扩展连接beanstalkd消息队列的运用

    关于beanstalk上面的文章介绍了beanstalkd消息队列服务端的安装,以及php里关于beanstalk扩展的安装,上文中提到有两种方式,我使用的是第二种connect方法连接服务端,并使用php安装扩展不采用php类文件。当前已安装好beanstalk的php扩展,使用使用php程序:

$beans = new Beanstalk();
print_r(get_class_methods($beans));
print_r($beans);

    打印出的安装的Beanstalk扩展可使用的方法如下:

#beanstalk对象可用方法列表,但不知道参数的具体传递形式。
Array
(
    [0] => connect
    [1] => close
    [2] => put
    [3] => peek
    [4] => peekReady
    [5] => delete
    [6] => stats
    [7] => bury
    [8] => ignore
    [9] => kick
    [10] => kickJob
    [11] => listTubes
    [12] => listTubesWatched
    [13] => listTubeUsed
    [14] => pauseTube
    [15] => resumeTube
    [16] => peekDelayed
    [17] => peekBuried
    [18] => putInTube
    [19] => release
    [20] => reserve
    [21] => statsJob
    [22] => statsTube
    [23] => touch
    [24] => useTube
    [25] => watch
)
#打印出业的beanstalk对象。在测试中除非通过设置属性,都没有找到传递host的方法。
Beanstalk Object
(
    [host] => 127.0.0.1
    [port] => 11300
    [connection] => Resource id #5
)

    有个问题是这个扩展也没有找到手册,都不知道它的方法参数应该怎么传递,不方便使用。我后来还是使用了github上的另外一个php扩展,

    地址:https://github.com/davidpersson/queue/tree/master/libs/beanstalk/src/Socket  本站下载地址如下:使用此类打印出的可使用方法如下:

Array
(
    [0] => __construct
    [1] => __destruct
    [2] => connect
    [3] => disconnect
    [4] => errors
    [5] => put
    [6] => choose
    [7] => useTube
    [8] => reserve
    [9] => delete
    [10] => release
    [11] => bury
    [12] => touch
    [13] => watch
    [14] => ignore
    [15] => peek
    [16] => peekReady
    [17] => peekDelayed
    [18] => peekBuried
    [19] => kick
    [20] => statsJob
    [21] => statsTube
    [22] => stats
    [23] => listTubes
    [24] => listTubeUsed
    [25] => listTubeChosen
    [26] => listTubesWatched
)
Socket_Beanstalk Object
(
    [connected] => 
    [_config:protected] => Array
        (
            [persistent] => 
            [host] => 192.168.168.8
            [port] => 11300
            [timeout] => 3
        )

    [_connection:protected] => 
    [_errors:protected] => Array
        (
        )
)

    上面这段使用的php代码如下,考虑到使用方便还是这个比较好,毕竟要查看方法怎么调用,可以直接查看php文件。put的返回值为插入的job的ID。插入成功后telnet进beans查看stats结果可以看到是否插入成功。

require_once 'Beanstalk.php';

$beanstalk = new Socket_Beanstalk(array(
    'persistent' => false, //是否长连接
    'host' => '192.168.168.8',
    'port' => 11300, //端口号默认11300
    'timeout' => 3 //连接超时时间
));
print_r(get_class_methods($beanstalk));
print_r($beanstalk);

//判断beanstalk是否已连接
if (!$beanstalk->connect()) {
    exit(current($beanstalk->errors()));
}

//使用test这个tube
$beanstalk->useTube('test');
//往tube增加数据
//参数意义:10表示任务的优先级,0不等待直接放到ready队列中,60处理job的超时时间, job内容
$put = $beanstalk->put(10, 0, 60, 'test');
if (!$put) {
    exit('commit job fail');
}else{
    var_dump($put);
}
$beanstalk->disconnect();

beanstalk消息队列php扩展下载地址见本文资源或者搜索本博客中的资源文档。

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
PHP Swoole 提供了一个消息队列扩展,可以用于实现消息的发布/订阅功能,类似于 Beanstalkd。下面是一个简单的示例: 1. 安装 Swoole 扩展: ```bash pecl install swoole ``` 2. 创建一个消息处理类: ```php class MessageHandler { public function handle($message) { // 处理消息的逻辑 // ... } } ``` 3. 创建一个 Swoole 服务: ```php $server = new Swoole\Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP); $messageHandler = new MessageHandler(); $server->on('WorkerStart', function($serv, $worker_id) use ($messageHandler) { // 创建一个 MessageHandler 实例 }); $server->on('Receive', function($serv, $fd, $from_id, $data) { // 将消息发送到消息队列中 $serv->sendMessage($data); }); $server->on('PipeMessage', function($serv, $src_worker_id, $message) use ($messageHandler) { // 处理消息 $messageHandler->handle($message); }); $server->start(); ``` 4. 启动 Swoole 服务,并发送消息到队列中: ```php $client = new Swoole\Client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9501, -1)) { exit("connect failed. Error: {$client->errCode}\n"); } $client->send('hello world'); $client->close(); ``` 当有消息发送到队列中时,Swoole 会将消息交给 `MessageHandler` 类的 `handle` 方法处理。需要注意的是,Swoole 的消息处理是异步的,不会阻塞主进程的执行。同时,Swoole 提供了 `sendMessage` 方法来发送消息到消息队列中,并且支持多个进程处理消息,实现了类似于 Beanstalkd 的订阅发布功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值