workerman+php+apache+redis建立一个消息队列(包括安装php-redis扩展遇到的坑)

    因为一些项目原因和网络信号传递机制的改动,所以需要在服务器上加上一个消息缓存队列,来保证消息的正确及时的接收和处理。通过之前对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,然后一直没有安装成功。打开这个网址会看到如下文件下载:

workerman+php+apache+redis建立一个消息队列(包括安装php-redis扩展遇到的坑)_第1张图片

    上图我红色笔圈起来的就是两个大坑,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中取数据处理,生产者文件代码如下:

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();
    另外一个消费者的代码如下:

count = 4;
//在进程开启之时
$handle_worker->onWorkerStart = function($handle_worker) {
	
	\Workerman\Lib\Timer::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中的数据。消息队列雏形形成了。





你可能感兴趣的:(php-redis,redis,workerman,消息队列,php,redis不定时的学习)