[文章作者:张宴 本文版本:v1.7.1 最后修改:2011.11.04 转载请注明原文链接:http://blog.zyan.cc/httpsqs/]

  HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。

  项目网址http://code.google.com/p/httpsqs/
  使用文档http://blog.zyan.cc/httpsqs/
  使用环境:Linux(同时支持32位、64位操作系统,推荐使用64位操作系统)
  软件作者:张宴

  队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。利用消息队列可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取消息队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。

  HTTPSQS 具有以下特征:

  ● 非常简单,基于 HTTP GET/POST 协议。PHP、Java、Perl、Shell、Python、Ruby等支持HTTP协议的编程语言均可调用。
  ● 非常快速,入队列、出队列速度超过10000次/秒。
  ● 高并发,支持上万的并发连接,C10K不成问题。
  ● 支持多队列。
  ● 单个队列支持的最大队列数量高达10亿条。
  ● 低内存消耗,海量数据存储,存储几十GB的数据只需不到100MB的物理内存缓冲区。
  ● 可以在不停止服务的情况下便捷地修改单个队列的最大队列数量。
  ● 可以实时查看队列状态(入队列位置、出队列位置、未读队列数量、最大队列数量)。
  ● 可以查看指定队列ID(队列点)的内容,包括未出、已出的队列内容。
  ● 查看队列内容时,支持多字符集编码。
  ● 源代码不超过800行,适合二次开发。

  点击在新窗口中浏览此图片



  1、HTTPSQS 1.7 压力测试:

  采用Apache ab命令进行压力测试,开启10个线程,放入10万条文本数据(每条512字节)到队列中:
  使用HTTP Keep-Alive时:23018 requests/sec
  关闭HTTP Keep-Alive时:11840 requests/sec

  采用Apache ab命令进行压力测试,开启10个线程,从队列中取出10万条文本数据(每条512字节):
  使用HTTP Keep-Alive时:25982 requests/sec
  关闭HTTP Keep-Alive时:13294 requests/sec

  详细测试内容:http://code.google.com/p/httpsqs/wiki/BenchmarkTest

  生产环境应用:在金山游戏官网中,新闻、论坛帖子、客服公告、SNS社区等发生的增、删、改操作,文本内容实时写入HTTPSQS队列,全站搜索引擎增量索引准实时(1分钟内)更新的数据源取自HTTPSQS。HTTPSQS 2009年12月18日上线至今,运行稳定,既有来自Web服务器的入队列操作,也有来自命令行脚本的批量入、出队列操作。



  2、HTTPSQS 的生产环境应用:

  ●金山通行证(https://my.xoyo.com
  队列应用类型:手机短信上行、手机短信下发、邮件下发
  队列应用要求:稳定性高,存储数据量大
  队列部署结构:一主、一备两台 HTTPSQS 热备模式

  ●金山用户行为分析系统(http://kbi.xoyo.com
  队列应用类型:用户鼠标点击、访问URL原始数据采集
  队列应用要求:并发性能高,存储数据量大
  队列部署结构:多台 HTTPSQS 应用层哈希分布式模式

  ●金山网络游戏运营平台 KingEyes
  队列应用类型:用户操作日志记录

  ●金山逍遥网站内搜索
  队列应用类型:索引准实时更新。在金山游戏官网中,新闻、论坛帖子、客服公告、SNS社区等发生的增、删、改操作,文本内容实时写入HTTPSQS队列,全站搜索引擎增量索引准实时(1分钟内)更新的数据源取自HTTPSQS。

  ●金山逍遥网全站通用评论系统
  队列应用类型:评论发表

  ●金山《剑侠情缘》电视连续剧四大角色人物选秀活动(http://zt.xoyo.com/haixuan/
  队列应用类型:用户上传的照片异步裁剪、缩放处理

  ●新浪邮箱(http://mail.sina.com.cn
  队列应用类型:用户登陆日志记录



  3、HTTPSQS 编译安装:

ulimit -SHn 65535

wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gz
tar zxvf libevent-2.0.12-stable.tar.gz
cd libevent-2.0.12-stable/
./configure --prefix=/usr/local/libevent-2.0.12-stable/
make
make install
cd ../

wget http://httpsqs.googlecode.com/files/tokyocabinet-1.4.47.tar.gz
tar zxvf tokyocabinet-1.4.47.tar.gz
cd tokyocabinet-1.4.47/
./configure --prefix=/usr/local/tokyocabinet-1.4.47/
#注:在32位Linux操作系统上编译Tokyo cabinet,请使用./configure --enable-off64代替./configure,可以使数据库文件突破2GB的限制。
#./configure --enable-off64 --prefix=/usr/local/tokyocabinet-1.4.47/
make
make install
cd ../

wget http://httpsqs.googlecode.com/files/httpsqs-1.7.tar.gz
tar zxvf httpsqs-1.7.tar.gz
cd httpsqs-1.7/
make
make install
cd ../




  4、HTTPSQS 服务器使用文档:

  点击在新窗口中浏览此图片

  [root@xoyo ~]# httpsqs -h
-l <ip_addr> 监听的IP地址,默认值为 0.0.0.0
-p <num> 监听的TCP端口(默认值:1218)
-x <path> 数据库目录,目录不存在会自动创建(例如:/opt/httpsqs/data)
-t <second> HTTP请求的超时时间(默认值:3)
-s <second> 同步内存缓冲区内容到磁盘的间隔秒数(默认值:5)
-c <num> 内存中缓存的最大非叶子节点数(默认值:1024)
-m <size> 数据库内存缓存大小,单位:MB(默认值:100)
-i <file> 保存进程PID到文件中(默认值:/tmp/httpsqs.pid)
-a <auth> 访问HTTPSQS的验证密码(例如:mypass123)
-d 以守护进程运行
-h 显示这个帮助


  示例:
ulimit -SHn 65535
httpsqs -d -p 1218 -x /data0/queue


  请使用命令“killall httpsqs”、“pkill httpsqs”和“kill `cat /tmp/httpsqs.pid`”来停止httpsqs。

  注意:请不要使用命令“pkill -9 httpsqs”和“kill -9  httpsqs的进程ID”来结束httpsqs,否则,内存中尚未保存到磁盘的数据将会丢失。



  5、HTTPSQS 客户端使用文档:

  (1)、入队列(将文本消息放入队列):

  HTTP GET 协议(以curl命令为例):
curl "http://host:port/?name=your_queue_name&opt=put&data=经过URL编码的文本消息&auth=mypass123"


  HTTP POST 协议(以curl命令为例):
curl -d "经过URL编码的文本消息" "http://host:port/?name=your_queue_name&opt=put&auth=mypass123"


  以浏览器为例:
  点击在新窗口中浏览此图片

  如果入队列成功,返回:
HTTPSQS_PUT_OK


  如果入队列失败,返回:
HTTPSQS_PUT_ERROR


  如果队列已满,返回:
HTTPSQS_PUT_END


  从HTTPSQS 1.2版本开始,在返回给客户端的HTTP Header头中增加了一行“Pos: xxx”,输出当前队列的读取位置点,例如:
HTTP/1.1 200 OK
Content-Type: text/plain
Keep-Alive: 120
Pos: 19
Date: Thu, 18 Mar 2010 04:57:08 GMT
Content-Length: 14

HTTPSQS_PUT_OK




  (2)、出队列(从队列中取出文本消息):

  HTTP GET 协议(以curl命令为例):
curl "http://host:port/?charset=utf-8&name=your_queue_name&opt=get&auth=mypass123"


curl "http://host:port/?charset=gb2312&name=your_queue_name&opt=get&auth=mypass123"


  以浏览器为例:
  点击在新窗口中浏览此图片

  返回消息队列的内容给客户端。

  如果没有未取出的消息队列,则返回:
HTTPSQS_GET_END


  从HTTPSQS 1.2版本开始,在返回给客户端的HTTP Header头中增加了一行“Pos: xxx”,输出当前队列的读取位置点,例如:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Keep-Alive: 120
Pos: 7
Date: Thu, 18 Mar 2010 04:56:01 GMT
Content-Length: 18

消息队列内容


  参数charset说明(例如:/?charset=utf-8):
  指定HTTP输出Header头的字符编码,即:
  Content-Type: text/plain; charset=utf-8

  任何在IANA注册的字符编码均可使用,但是,并不是所有的浏览器都能解析全部的字符编码。对于中文,常用的字符编码有:utf-8、gb2312、gbk、gb18030、big5等。



  (3)、查看队列状态(普通方式,便于浏览器查看):

  HTTP GET 协议(以curl命令为例):

curl "http://host:port/?name=your_queue_name&opt=status&auth=mypass123"


  返回(示例):

HTTP Simple Queue Service v1.7
------------------------------
Queue Name: xoyo
Maximum number of queues: 1000000
Put position of queue (1st lap): 45
Get position of queue (1st lap): 6
Number of unread queue: 39


  如果“队列写入点值”大于“最大队列数量值”,将重置“队列写入点”为1,即又从1开始存储新的队列内容,覆盖原来队列位置点的内容:

HTTP Simple Queue Service v1.7
------------------------------
Queue Name: xoyo
Maximum number of queues: 1000000
Put position of queue (2st lap): 4562
Get position of queue (1st lap): 900045
Number of unread queue: 104517


  以浏览器为例:
  点击在新窗口中浏览此图片



  (4)、查看队列状态(JSON方式,便于程序处理返回内容):

  从HTTPSQS 1.3版本开始支持此功能。

  HTTP GET 协议(以curl命令为例):

curl "http://host:port/?name=your_queue_name&opt=status_json&auth=mypass123"


  返回(示例):

{"name":"xoyo","maxqueue":1000000,"putpos":45,"putlap":1,"getpos":6,"getlap":1,"unread":39}


  如果“队列写入点值”大于“最大队列数量值”,将重置“队列写入点”为1,即又从1开始存储新的队列内容,覆盖原来队列位置点的内容:

{"name":"xoyo","maxqueue":1000000,"putpos":4562,"putlap":2,"getpos":900045,"getlap":1,"unread":104517}




  (5)、查看指定队列位置点的内容:

  跟一般的队列系统不同的是,HTTPSQS 可以查看指定队列ID(队列点)的内容,包括未出、已出的队列内容。可以方便地观测进入队列的内容是否正确。

  另外,假设有一个发送手机短信的队列,由客户端守护进程从队列中取出信息,并调用“短信网关接口”发送短信。但是,如果某段时间“短信网关接口”有故障,而这段时间队列位置点300~900的信息已经出队列,但是发送短信失败,我们还可以在位置点300~900被覆盖前,查看到这些位置点的内容,作相应的处理。

  HTTP GET 协议(以curl命令为例):

curl "http://host:port/?charset=utf-8&name=your_queue_name&opt=view&pos=5&auth=mypass123"


curl "http://host:port/?charset=gb2312&name=your_queue_name&opt=view&pos=19&auth=mypass123"


  pos >=1 并且 <= 1000000000

  返回指定队列位置点的内容。



  (6)、重置指定队列:

  HTTP GET 协议(以curl命令为例):

curl "http://host:port/?name=your_queue_name&opt=reset&auth=mypass123"


  如果重置成功,返回:

HTTPSQS_RESET_OK


  如果重置失败,返回:

HTTPSQS_RESET_ERROR




  (7)、更改指定队列的最大队列数量:

  默认的最大队列长度(100万条):1000000

  HTTP GET 协议(以curl命令为例):

curl "http://host:port/?name=your_queue_name&opt=maxqueue&num=1000000000&auth=mypass123"


  num >=10 并且 <= 1000000000

  如果更改最大队列数量成功,则返回:

HTTPSQS_MAXQUEUE_OK


  更改的最大队列数量必须大于当前的“队列写入点”。另外,当“队列写入点”小于“队列读取点”时(即PUT位于圆环的第二圈,而GET位于圆环的第一圈时),本操作将被取消,然后返回给客户端以下信息:

HTTPSQS_MAXQUEUE_CANCEL




  (8)、不停止服务的情况下,修改定时刷新内存缓冲区内容到磁盘的间隔时间:

  从HTTPSQS 1.3版本开始支持此功能。

  默认间隔时间:5秒 或 httpsqs -s <second> 参数设置的值。

  HTTP GET 协议(以curl命令为例):

curl "http://host:port/?name=your_queue_name&opt=synctime&num=10&auth=mypass123"


  num >=1 and <= 1000000000

  如果修改间隔时间成功,则返回:

HTTPSQS_SYNCTIME_OK


  如果 num 不在 1 ~ 1000000000 之间,本操作将被取消,然后返回给客户端以下信息:

HTTPSQS_SYNCTIME_CANCEL




  (9)、密码校验失败:

  从HTTPSQS 1.5版本开始支持此功能。

  如果密码校验失败(/?auth=xxx),将返回以下信息:
HTTPSQS_AUTH_FAILED




  (10)、全局错误:

  如果发生全局错误(即指令、参数错误等),将返回以下信息:
HTTPSQS_ERROR




  6、HTTPSQS 客户端

  (1)、PHP 客户端说明文档:


  A、PHP 客户端扩展(第三方提供,详情请访问:http://code.google.com/p/php-httpsqs-client/

  B、PHP 客户端 Class 文件(官方提供:适用于 HTTPSQS 1.7 以上版本,推荐使用。)

  查看 PHP Class 源代码:httpsqs_client.php

  PHP Client 所有函数使用示例:test_example.php

  PHP Client 命令行运行示例:test_commandline.php

  用法:




  (2)、Perl 客户端说明文档(第三方提供,作者:tonny0830):

  查看Perl客户端源代码:perl client

HttpSQS 模块参数说明
开发平台:CentOS 5.4
Perl版本:5.8.8
Editor: VIM
##################################################################
new 方法:

参数个数:4个

参数说明:
  1.HttpSQS-服务器IP地址。
  2.HttpSQS-工作端口号。
  3.Proto-连接服务器协议类型,TCP 还是UDP. 默认是TCP连接。
  4.Charset-字符集。默认是UTF-8。
###################################################################
put方法:

参数个数:2个

传递参数:
  1.队列名
    2.以POST方式提交的字符串
####################################################################
get方法:

参数个数:1个

传递参数:
    1.队列名
####################################################################
status方法:

参数个数:1个

传递参数:
    1.队列名
#####################################################################
view方法:

参数个数:2个

传递参数:
    1.队列名
    2.查看队列的编号
#####################################################################
reset方法:

参数个数:1个

传递参数:
    1.队列名
#####################################################################
maxqueue方法:

参数个数:2个

传递参数:
    1.队列名
    2.指定的最大队列数
#####################################################################
pput方法:

参数个数:2个

传递参数:
    1.队列名
    2.POST方式提交的数据。
#####################################################################
pget方法:

参数个数:1个

传递参数:
    1.队列名
#####################################################################
pstatus方法:

参数个数:1个

传递参数:
    1.队列名
#####################################################################
pview方法:

参数个数:2个

传递参数:
    1.队列名
    2.查看队列的编号。
#####################################################################
pmaxqueue方法:

参数个数:2个

传递参数:
    1.队列名
    2.指定队列的最大数。
#####################################################################
preset方法:

参数个数:1个

传递参数:
    1.队列名
#####################################################################

使用的例子见:
httpsqs_cmdline_test.pl
httpsqs_cmdline_loop_test.pl



  (3)、C 客户端示例(第三方提供,作者:李博):

  查看C客户端示例源代码:C client



  (4)、Java 客户端

  A、第一款客户端(推荐)(第三方提供,作者:Snow Young):


  下载 1.0 版本:http://httpsqs.googlecode.com/files/httpsqs4j-java-client-1.0.zip

  从SVN下载最新代码:svn checkout http://httpsqs.googlecode.com/svn/trunk/client/httpsqs4j/ httpsqs4j

  帮助文档:http://blog.zyan.cc/book/httpsqs/client/httpsqs4j/


  B、第二款客户端(第三方提供,作者:李博):

  查看Java客户端示例源代码:Java client



  (5)、Python客户端(第三方提供,作者:Wendal):

  下载:http://wendal.net/261.html



  7、HTTPSQS 生产环境典型应用案例架构:

  点击在新窗口中浏览此图片

  一个采用PHP编写的HTTPSQS客户端简单守护进程框架如下:

  环境,假设PHP安装路径为/usr/local/webserver/php,使用PHP编写一个文件/opt/httpsqs_client_daemon.php:

  在Linux下,推送到后台执行即可:
nohup /usr/local/webserver/php/bin/php /opt/httpsqs_client_daemon.php 2>&1 > /dev/null &




  8、HTTPSQS 软件版本修改历史:

  ● [2009年12月29日] HTTPSQS 1.1 版本发布。这是第一个开源发布版本。
  ● [2010年03月18日] HTTPSQS 1.2 版本发布。点击这儿查看该版本的新增功能
  ● [2010年06月28日] HTTPSQS 1.3 版本发布。点击这儿查看该版本的新增功能
  ● [2011年04月21日] HTTPSQS 1.6 版本发布。点击这儿查看该版本的新增功能
  ● [2011年07月26日] HTTPSQS 1.7 版本发布。点击这儿查看该版本的新增功能



  附:本使用文档修改历史

  ● [2009年12月30日] [Version 1.1.0] HTTPSQS 1.1 版本使用文档。
  ● [2010年03月18日] [Version 1.2.0] HTTPSQS 1.2 版本使用文档。增加了 HTTPSQS 1.2 版本新增功能的说明,以及生产环境典型应用案例架构图。
  ● [2010年03月19日] [Version 1.2.1] 在第7节中,增加了一个采用PHP编写的HTTPSQS客户端简单守护进程框架代码。
  ● [2010年04月07日] [Version 1.2.2] 在第6节中,增加了第三方的C客户端示例和Java客户端示例。
  ● [2010年04月30日] [Version 1.2.3] 在第6节中,再增加了一款第三方Java客户端:httpsqs4j。
  ● [2010年05月11日] [Version 1.2.4] 解决了在某些Linux系统上,默认动态链接库目录中找不到TC动态链接库的问题:/usr/bin/httpsqs: error while loading shared libraries: libtokyocabinet.so.9: cannot open shared object file: No such file or directory。
  ● [2010年06月29日] [Version 1.3.0] HTTPSQS 1.3 版本使用文档。增加了 HTTPSQS 1.3 版本新增功能的说明。
  ● [2010年08月26日] [Version 1.3.1] 在第6节中,增加了第三方PHP客户端扩展链接。
  ● [2011年04月21日] [Version 1.6.0] HTTPSQS 1.6 版本使用文档。增加了 HTTPSQS 1.6 版本新增功能的说明。
  ● [2011年07月26日] [Version 1.7.0] HTTPSQS 1.7 版本使用文档。修复一处BUG,改为动态编译HTTPSQS。
  ● [2011年11月04日] [Version 1.7.1] 增加支持 HTTPSQS 1.7 版本的 PHP Client Class。



技术大类 » Cache与存储 | 评论(233) | 引用(0) | 阅读(406898)
winder
2012-3-9 14:42
HTTPQSQ 在AIX上兼容么?
mike1
2012-3-13 22:23
很好 很喜欢这个帖子
好,应该顶,今后继续努力
我见过的最好的帖子了,谢谢楼主
有意义,有收获,谢谢提供
挺好,很实用
帖子不错,多谢楼主分享心得
祛痘痘
you
2012-3-19 16:11
我想获取已经建立的所有队列名称,好像没有这个功能?
woaipengjiale Email
2012-3-21 17:09
你好张兄,我的httpsqs.db越来越大我要如何才能在不停服务器的情况下清除以前不需要的记录,先谢过
photo Email Homepage
2012-3-31 14:42
请求:如果创建多个worker进程?httpsqs启动后,默认是一个master,一个worker,如果创建多个worker进程??
huayangmeng Email
2012-4-28 09:32
您好,想向您请教一下,如果是在生产环境下使用httpsqs,推荐使用第三方的客户端还是用官方提供的class文件呢?
Jetty
2012-5-10 14:39
你好, 请问如何查看队列服务器中现在存在哪些队列呢?  也就是说,如果列出所有队列的名称, 怎么办?
Hogan Email Homepage
2012-5-10 17:56
Ci sono diversi motivi principali per cui si può sicuramente trovare sul proprio volere le soluzioni contabili che coinvolgono tutta Stansted, anche se alcune persone potrebbero uomini e donne, probabilmente si dovrà disporre di soluzioni contabili rispetto con la gente. Stai con me per scoprire di più su molti dei motivi per prendere in considerazione l'impiego contabili in tutta Hogan Stansted. Costruire un businessIf vi capita di essere in funzione, è abbastanza possibile che si può fare uso di soluzioni contabili. Non date per scontato tutte le società hanno abbastanza soldi per utilizzare a tempo pieno il personale fiscali, così utilizzando una conditi insieme con l'agenzia affidabile che coinvolge tutta commercialisti Stansted potrebbe rendere meno difficili problemi.
hogan280 Email
2012-5-10 18:08
Nove mesi dopo, nell'agosto 2009, il Crown Prosecution Service ha deciso di non caricare i due uomini, come la Hogan ragazza avrebbe fatto un "testimone inattendibile" e l'avvocato dubitava alcuna giuria avrebbe creduto.
hu
2012-5-16 17:01
前两个安装都ok 但是到了第三个就报错了
cd httpsqs-1.7/
make

gcc -o httpsqs httpsqs.c prename.c -Wl,-rpath,/usr/local/libevent-2.0.12-stable/lib/:/usr/local/tokyocabinet-1.4.47/lib/ -L/usr/local/libevent-2.0.12-stable/lib/ -levent -L/usr/local/tokyocabinet-1.4.47/lib/ -ltokyocabinet -I/usr/local/libevent-2.0.12-stable/include/ -I/usr/local/tokyocabinet-1.4.47/include/ -lz -lbz2 -lrt -lpthread -lm -lc -O2 -g
httpsqs.c:35:19: fatal error: event.h: 没有那个文件或目录
compilation terminated.
make: *** [httpsqs] 错误 1
stephen Email Homepage
2012-5-23 17:07
HTTPSQS 1.7的php extension对于view和status会出错,应该是版本问题。
改进了下PHP的Class:
1、用curl代替socket读写,重写了http_put和http_get
2、在put时增加is_string判断,不然若put一个数组进来就出错了

    public function http_get($query)
  {
    $defaults = array(
      CURLOPT_URL => $this->httpsqs_host.$query,
      CURLOPT_HEADER => 1,
      CURLOPT_RETURNTRANSFER => 1,
      CURLOPT_TIMEOUT => 10
    );
    
    $ch = curl_init();
    curl_setopt_array($ch, $defaults);
    if( ! $result = curl_exec($ch))
    {
      trigger_error(curl_error($ch));
    }
    curl_close($ch);
    list($header, $body) = explode("\r\n\r\n", $result, 2);
    preg_match("/Pos:([^\r\n]*)/i", $header, $matches);
    $result_array["pos"] = (int)trim($matches[1]);
    $result_array["data"] = trim($body);
    return $result_array;
  }

    public function http_post($query, $body)
    {
        $defaults = array(
      CURLOPT_URL => $this->httpsqs_host.$query,
      CURLOPT_HEADER => 1,
      CURLOPT_RETURNTRANSFER => 1,
      CURLOPT_POST => 1,
      CURLOPT_POSTFIELDS => $body,
      CURLOPT_TIMEOUT => 10
    );
    
    $ch = curl_init();
    curl_setopt_array($ch, $defaults);
    if( ! $result = curl_exec($ch))
    {
      trigger_error(curl_error($ch));
    }
    curl_close($ch);
    list($header, $body) = explode("\r\n\r\n", $result, 2);
    preg_match("/Pos:([^\r\n]*)/i", $header, $matches);
    $result_array["pos"] = (int)trim($matches[1]);
    $result_array["data"] = trim($body);
    return $result_array;
    }
  
    public function put($queue_name, $queue_data)
    {
    if (is_string($queue_data))
    {
      $result = $this->http_post("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=put", $queue_data);
      if ($result["data"] == "HTTPSQS_PUT_OK") {
        return true;
      } else if ($result["data"] == "HTTPSQS_PUT_END") {
        return $result["data"];
      }
    }
    return false;
    }
xiaohai123 Email Homepage
2012-6-8 10:39
Les produits de la marque Versace, y compris les verres,<a href="http://www.saclongchampss.com">Sac Longchamp Pliage,Boutique,Sacs Longchamp Pas Cher</a>  le parfum des sacs de maquillage décoration intérieure écharpe montres bijoux soins de la peau http://www.saclongchampss.com ceinture, Gianni Versace SpA Groupe est le leader mondial de salle internationale design de mode. Le sac Mme les Xiekua (6:27) sacs Mme d'acheter (6:27), le classement de Mme la marque de sac (6:27) liste le sac de Mme. Bo?te A propos de Global conquérir le monde! Mondial bagages agent de gros net des sacs en cuir de marque Marchands Chine,
<a href="http://www.saclongchampss.com">sac pas cher</a> du cuir, sacs en cuir de rejoindre, à la conception des sacs, sacs à main en cuir d'information
moon
2012-6-11 00:54
1.客户端处理失败了,服务器不知道啊?(服务器无法根据客户端处理结果来做相应处理,比如失败了回滚操作,所以httpsqs只能用于非关键调用,就是允许失败、丢失)2.客户端要从队列取消息,是要写个无限循环吗?(对httpsqs服务有影响吗)
inaoke Email Homepage
2012-7-31 15:32
查看项目GET功能,当处理程序需要处理大量数据时,只可一条条读取,导致频繁的使用http协议于httpsqs通讯,也会是服务器压力过大.看了C语言GET功能处的代码,稍微修改了一下,增加获取多条数据功能,但是由于本人对程序处理逻辑不是很了解,怕影响自身的运行,可否帮忙看下代码是否有问题?
出队列处:(使用了的num参数.)
int queue_get_value = 0;
char queue_name[300] = {0}; /* 队列名称的总长度,用户输入的队列长度少于256字节 */
char *httpsqs_output_value;int i=0;
do{  
       queue_get_value=httpsqs_now_getpos((char *)httpsqs_input_name);    
       if(queue_get_value==0){        
            evbuffer_add_printf(buf,"%s","HTTPSQS_GET_END");            
            break;
        }else{        
              sprintf(queue_name,"%s:%d",httpsqs_input_name,queue_get_value);          
              httpsqs_output_value=tcbdbget2(httpsqs_db_tcbdb,queue_name);            
              if(httpsqs_output_value){                
                   if(i>0){evbuffer_add_printf(buf,"%s","<br/>");}//分割符                  
            evbuffer_add_printf(buf,"%s",httpsqs_output_value);                
                  free(httpsqs_output_value);
               }else{                  
                  evbuffer_add_printf(buf,"%s","HTTPSQS_GET_END");                  
                  break;            
                 }      
          }    
           i++;
}while(i<httpsqs_input_num);
memset(queue_name,'\0',300);
sprintf(queue_name,"%d",queue_get_value);
evhttp_add_header(req->output_headers,"Pos",queue_name);
小Z Email
2012-8-28 16:06
您好,张老师。
我最近准备要用HHTPSQS,可是有个问题
while(1){
$v = get();//这里有个问题,是不是每次都要请求一次HTTPSQS呢?
if($v != 'end'){
  

}else{
sleep(10);
}
}
雪洁 Homepage
2012-9-6 15:08
我测试写入队列100万 为什么写到8万左右以后返回的都是空呢?不是说返回的只有这三种状态吗?如果入队列成功,返回:HTTPSQS_PUT_OK如果入队列失败,返回:HTTPSQS_PUT_ERROR如果队列已满,返回:HTTPSQS_PUT_END那什么样的情况会是空呢?
FDGG Email Homepage
2012-9-27 09:00
To total your seem group it up using the Karen Millen dresses appropriate accessories, to guarantee that you can seem stunning.Whenever you program to buy shoes, ensure you browse via the on line shoe stores to obtain the perfect pair for yourself.head of hair design is extremely important, since it not merely defines the seem of the deal with however it reflects the complete personality. deciding on a head of hair minimize is commonly Karen Millen a extremely uncomplicated process for most on the men; they go to some barber store and request him/her to minimize their hairs so the hairs don't seem shabby and overgrown. extremely several adult men minimize their hairs in distinct styles.Men commonly don't treatment very much concerning the hairs, since most adult men prefer to maintain their hairs short; so the Karen Millen Dublin conventional or fashionable slicing of brief hairs does not issue based on countless men.
aaa
2012-10-4 19:17
张哥,那个client.c的客户端有一点小问题get view put等方法都有对POS和DATA的初始化memset(dataarr[0], 0, strlen(dataarr[0]));memset(dataarr[1], 0, strlen(dataarr[1]));而未赋值前,dataarr[0]与dataarr[1]的strlen应该都是0吧,所以初始化应该为memset(dataarr[0], 0,2000);memset(dataarr[1], 0, 2000);否则输出的结尾会有乱码
分页: 9/12 第一页 上页 4 5 6 7 8 9 10 11 12 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]