php使用zeromq

Zeromq是个啥玩意?

Connect your code in any language, on any platform.
Carries messages across inproc, IPC, TCP, TPIC, multicast.
Smart patterns like pub-sub, push-pull, and router-dealer.
High-speed asynchronous I/O engines, in a tiny library.
Backed by a large and active open source community.
Supports every modern language and platform.
Build any architecture: centralized, distributed, small, or large.
Free software with full commercial support

以上是官方页面的介绍,大意是说一种跨平台,可以使用任何语言使用的消息中间件,可以通过inproc,IPC,TCP,TPIC,多播的消息传递消息,包括多种模式,pub-sub(分发-订阅),push-pull(推送模式),router-dealer(路由模式)等等等等。极高的处理速度是其重要的特性之一。

官方详细介绍请访问:http://zeromq.org/

安装:

#wget http://download.zeromq.org/zeromq-4.0.4.tar.gz

#tar zxvf zeromq-4.0.4.tar.gz

#cd zeromq-4.0.4

#./configure=/usr/local/zeromq404

#make

#make install

安装PHP扩展:

#git clone git://github.com/mkoppanen/php-zmq.git

#cd php-zmq

#/usr/local/php/bin/phpize         //自己PHP的安装目录,根据需要更改

#./configure --with-php-config=/usr/local/php/bin/php-config --with-zmq=/usr/local/zeromq404    //php-config需要根据自己的情况进行更改

#make

#make install

安装好之后会在/usr/local/php/lib/php/extensions/no-debug-zts-20090626/目录下面生成zmq.so

修改配置文件:

#vim /etc/php.ini

修改extension_dir="/usr/local/php/lib/php/extensions/no-debug-zts-20090626/"

增加extension=zmq.so

重启apache

访问phpinfo,如果看到zmq的相关信息表明已经OK了

测试:

系统分两部分:client和server端

server端一般由phpcli来执行,常驻后台,监听一个端口,此例中使用5555,代码如下:

zmqserver.php

<?php

/*

* * Hello World server

* * Binds REP socket to tcp://*:5555

* * Expects "Hello" from client, replies with "World"

* * @author Ian Barber <ian(dot)barber(at)gmail(dot)com>

* */

$context = new ZMQContext(1);

// Socket to talk to clients

$responder = new ZMQSocket($context, ZMQ::SOCKET_REP);

$responder->bind("tcp://*:5555");

while (true) {

$request = $responder->recv();

printf ("Received request: [%s]\n", $request);

logtxt($request);

usleep (100);

$responder->send("World");

}

function logtxt($msg){

$handler = fopen("/tmp/log/zmq.log","a+");

fwrite($handler,date(‘Y-m-d H:i:s‘).‘    ‘.$msg."\r\n");

fclose($handler);

}

当我执行

#php zmqserver.php

的时候,报错,找不到"ZMQContext"的类

使用

#php -m

查看加载的类,发现木有,只有一些默认的

继续使用

#php --ini

发现加载INI的路径并不是/etc/php.ini

于是cp /etc/php.ini /usr/local/php/lib/php.ini

再次执行

#php zmqserver.php

ok

查看一下5555端口是否被监听:

#lsof -i:5555

在我的机器上出现了

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

php     35145 root    9u  IPv4 272314      0t0  TCP *:personal-agent (LISTEN)

表明监听成功.

下面编写client端

zmqclient.php

<?php

/*

* * Hello World client

* * Connects REQ socket to tcp://localhost:5555

* * Sends "Hello" to server, expects "World" back

* * @author Ian Barber <ian(dot)barber(at)gmail(dot)com>

* */

$context = new ZMQContext();

// Socket to talk to server

echo "Connecting to hello world server…\n";

$requester = new ZMQSocket($context, ZMQ::SOCKET_REQ);

$requester->connect("tcp://localhost:5555");

$date = mktime();

if($requester->send($date) !== false){

echo "send success\n";

}

$reply = $requester->recv();

printf ("Received:[%s]\n",$reply);

从浏览器访问zmqclient.php

可以正确接收到World的数据,同时在/tmp/log/zmq.log下面有新生成的日志文件

表明一切正常。

PS:

此例中使用了简单的:rep/req的请求应答模式,其实zmq支持的模式非常多,使用的场景也不尽相同,可以根据自己的实际情况灵活的选择合适的模式。

一些有用的资源:

官网:http://zeromq.org/

http://blog.fity.cn/post/382/

http://iyuan.iteye.com/category/148998

时间: 2024-09-19 02:54:24

php使用zeromq的相关文章

rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较

Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的读写性能. 针对Kafka性能方面进行简单分析,相关数据请参考:https://segmentfault.com/a/1190000003985468,下面介绍一下Kafka的架构和涉及到的名词: Topic:用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Parti

ZeroMQ接口函数之 :zmq_msg_set - 设置消息的性质

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_set zmq_msg_set(3)  ØMQ Manual - ØMQ/3.2.5 Name zmq_msg_set - 设置消息的性质 Synopsis int zmq_msg_set (zmq_msg_t *message, int property, int value); Description zmq_msg_set()函数会设置message参数指定的消息的属性,属性值由value参数指定

ZeroMQ接口函数之 :zmq_curve_keypair - 生成一个新的CURVE 密钥对

ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_curve_keypair zmq_curve_keypair(3) ØMQ Manual - ØMQ/4.1.0 Name zmq_curve_keypair - 生成一个新的CURVE 密钥对 Synopsis int zmq_curve_keypair (char *z85_public_key, char *z85_secret_key); Description 函数zmq_curve_keypair

消息队列库——ZeroMQ

消息队列库--ZeroMQ ZeroMQ(简称ZMQ)是一个基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字. ZMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间. ZMQ不是单独的服务,而是一个嵌入式库,它封装了网络通信.消息队列.线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信. 主线程与I/O线程: I

SaltStack(五) SaltStack与ZeroMQ

一.ZeroMQ描述 我们进行自动化运维大多数情况下,是我们的服务器数量已经远远超过人工SSH维护的范围,SaltStack可以支数以千计,甚至更多的服务器,这些性能的提供主要来自于ZeroMQ,因为SaltStack地城是基于ZeroMQ进行高效的网络通信,ZMQ用于node与node间的通信,node可以是主机也可以可以是进程. 二.ZeroMQ简介 ZeroMQ(我们通常还会OMQ,Zmq等来表示)是一个简单好用的传输层,像框架一样的一个套接字库,他使用的socket编程更加简单.简洁和性

死亡的协议--- Pieter Hintjens&#160;(ZeroMQ作者)

过去几年中用zeromq写过几个系统系统.对ZeroMQ强大和灵活印象非常深刻.在阅读zeromq guide文档时候.发现作者整理各种通信模式非常经典和实用,可以作为分布式通信的教科书来看.第一次见到这么有价值的开源框架说明文档 .  Pieter Hintjens   2010诊断出胆管癌,并成功手术切除.最近 (2016年4月)发现癌症大面积扩散到肺部,已经无法治疗. 他写的最后一篇通信模式是关于死亡协议. 原文地址是 A Protocol for Dying http://hintjen

zeromq源码分析笔记之线程间收发命令(2)

在zeromq源码分析笔记之架构说到了zmq的整体架构,可以看到线程间通信包括两类,一类是用于收发命令,告知对象该调用什么方法去做什么事情,命令的结构由command_t结构体确定:另一类是socket_base_t实例与session的消息通信,消息的结构由msg_t确定.命令的发送与存储是通过mailbox_t实现的,消息的发送和存储是通过pipe_t实现的,这两个结构都会详细说到,今天先说一下线程间的收发命令. zeromq的线程可分为两类,一类是io线程,像reaper_t.io_thr

zeromq源码分析笔记之准备篇

zeromq这个库主要用于进程通信,包括本地进程.网络通信,涉及到一些基础知识,主要包括管道通信,socket编程的内容,反应器模式(使用IO多路复用实现),无锁队列这几块比较重要的部分,下面的几个链接是这几块内容的学习笔记,有了这些知识,能比较好的理解这个开源库 1.socket原理详解 2.I/O多路复用之select 3.I/O多路复用之poll 4.I/O多路复用之epoll

消息中间件的技术选型心得-RabbitMQ、ActiveMQ和ZeroMQ

RabbitMQ.ActiveMQ和ZeroMQ都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?很多开发者面临这个烦恼.下面我会对这三个消息中间件做一个比较,看了后你们就心中有数了. RabbitMQ是AMQP协议领先的一个实现,它实现了代理(Broker)架构,意味着消息在发送到客户端之前可以在中央节点上排队.此特性使得RabbitMQ易于使用和部署,适宜于很多场景如路由.负载均衡或消息持久化等,用消息队列只需几行代码即可搞定.但是,这使得它的可扩展性差,速度较慢,因为中央节点增加了

ZeroMQ初步学习

今天先来编译一下ZeroMQ的示例程序. 首先要先安装zeromq,使用默认的选项./configure, make, make install. 然后是zeromq的server的示例代码 #include <zmq.hpp> #include <string> #include <iostream> #include <unistd.h> int main () { // Prepare our context and socket zmq::conte