apache 停止 php redis,workerman+php+apache+redis建立一个消息队列(包括安装php-redis扩展遇到的坑)-Go语言中文社区...

因为一些项目原因和网络信号传递机制的改动,所以需要在服务器上加上一个消息缓存队列,来保证消息的正确及时的接收和处理。通过之前对redis的学习,我准备将redis运用进来,毕竟书本上的知识还是要实际运用一下才能更好的理解。我参考了workerman的消息队列的用例项目,准备在端口上设定一个消息队列监听信息,对于新的信息的进入,会立马接收存入队列中,然后反馈机器接收到了数据,保证机器不会多次发送信息确认而导致浪费电力;然后设定一个定时器,定时从队列中取数据进行逻辑处理,为了保证实时性,时间会短一点,然后进程会开的多一些,保证能够快速处理,不会堵塞。首先,我现在windows上简单试验一下。

我在windows上安装的是wampserver软件,直接安装了lamp环境,redis下载下来配置下安装即可,比较简单,没遇到什么坑,建议百度一下。然后在这个基础上安装php-redis扩展,毕竟第一次安装,遇到了一些坑。我php版本是5.6的,所以我下载的redis扩展是https://windows.php.net/downloads/pecl/releases/redis/2.2.7/这个网址,版本是2.2.7的。这里有个坑,我也是安装一直不能在php扩展表中看到redis,然后一直没有安装成功。打开这个网址会看到如下文件下载:

75852d9a865ae806d0a9427a5632de8b.png

上图我红色笔圈起来的就是两个大坑,vc11还好,是php版本所对应的VC++是2011,这个只要查过php版本,根据版本选择就好,主要是这个文件区分为nts和ts,现在知道了分别是非线程安全和线程安全,这个命令行查询php版本的时候也会出现,之前没有注意这点,一直使用nts的版本,按照网上的教程走下来,却一直安装不上。注意这点后,下载下来,在这个网站上前一页还可以找到一个igbinary的文件,选择1.1.1的版本下载下来,然后将其中的php_igbinary.dll和php_redis.dll放在php目录下的ext中,然后修改php.ini,添加上

extension=php_igbinary.dll

extension=php_redis.dll    这个前后顺序不能更改,是有逻辑关系的。然后重启apache就好了。

我通讯框架选用的是workerman,因为在windows上,workerman框架在单个文件中的worker只能启动一个,然后功能上也受限制,所以作为开发环境,实验一下,主要生产环境还是采用linux上的版本。我们安装好workerman后,我写了两个文件,分别作为类似生产者和消费者关系的worker,一个文件主要是监听本地端口,将数据放入到redis中,另一个文件设定一个短的定时器,从redis中取数据处理,生产者文件代码如下:

use WorkermanWorker;

require_once __DIR__ . '/Workerman/Autoloader.php';

// 创建一个Worker监听2345端口,使用http协议通讯

$http_worker = new Worker("tcp://0.0.0.0:2345");

// 启动4个进程对外提供服务

//$http_worker->count = 4;

// 接收到数据时

$http_worker->onMessage = function($connection, $data)

{

$redis = new Redis();

$redis -> connect('127.0.0.1', '6379');

$redis -> lpush('queue', $data);

//接收到信息立即返回回应

$connection->send($data);

};

// 运行worker

Worker::runAll();    另外一个消费者的代码如下:

use WorkermanWorker;

require_once __DIR__ . '/Workerman/Autoloader.php';

$handle_worker = new Worker();

$handle_worker->count = 4;

//在进程开启之时

$handle_worker->onWorkerStart = function($handle_worker) {

WorkermanLibTimer::add(0.5, function() use ($handle_worker){

$redis = new Redis();

$redis -> connect('127.0.0.1', '6379');

$value = $redis -> rpop('queue');

echo $value;

});

};

// 运行worker

Worker::runAll();    代码很简单,看一下大家就明白了,然后我运行分别开一个cmd窗口,使用命令行php xxx.php(这是文件名称)的命令来启动两个文件,之后用sockettool工具模拟TCP客户端发送数据,经过测试,二者都打开的情况下,数据可以及时的输出出来,如果消费者关闭掉了,生产者还是可以运行的,数据会在redis中存储,然后打开消费者,消费者会立即消费redis中的数据。消息队列雏形形成了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值