原文地址:http://blog.s135.com/httpsqs

1.安装

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 ../

性能调优(可选

#ulimit -SHn 65535

2.启动

#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,否则,内存中尚未保存到磁盘的数据将会丢失。


3.调用

(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"

(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_client.php

<?php
/* ----------------------------------------------------------------------------------------------------------------
HTTP Simple Queue Service - httpsqs client class for PHP v1.7.1
Author: Zhang Yan (http://blog.s135.com), E-mail: net@s135.com
This is free software, and you are welcome to modify and redistribute it under the New BSD License
----------------------------------------------------------------------------------------------------------------
Useage:
<?php include_once("httpsqs_client.php");
$httpsqs = new httpsqs($httpsqs_host, $httpsqs_port, $httpsqs_auth, $httpsqs_charset);
$result = $httpsqs->put($queue_name, $queue_data); //1. PUT text message into a queue. If PUT successful, return boolean: true. If an error occurs, return boolean: false. If queue full, return text: HTTPSQS_PUT_END
$result = $httpsqs->get($queue_name); //2. GET text message from a queue. Return the queue contents. If an error occurs, return boolean: false. If there is no unread queue message, return text: HTTPSQS_GET_END
$result = $httpsqs->gets($queue_name); //3. GET text message and pos from a queue. Return example: array("pos" => 7, "data" => "text message"). If an error occurs, return boolean: false. If there is no unread queue message, return: array("pos" => 0, "data" => "HTTPSQS_GET_END")
$result = $httpsqs->status($queue_name); //4. View queue status
$result = $httpsqs->status_json($queue_name); //5. View queue status in json. Return example: {"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10}
$result = $httpsqs->view($queue_name, $queue_pos); //6. View the contents of the specified queue pos (id). Return the contents of the specified queue pos.
$result = $httpsqs->reset($queue_name); //7. Reset the queue. If reset successful, return boolean: true. If an error occurs, return boolean: false
$result = $httpsqs->maxqueue($queue_name, $num); //8. Change the maximum queue length of per-queue. If change the maximum queue length successful, return boolean: true. If  it be cancelled, return boolean: false
$result = $httpsqs->synctime($num); //9. Change the interval to sync updated contents to the disk. If change the interval successful, return boolean: true. If  it be cancelled, return boolean: false
?>
---------------------------------------------------------------------------------------------------------------- */
class httpsqs {
public $httpsqs_host;
public $httpsqs_port;
public $httpsqs_auth;
public $httpsqs_charset;
public function __construct() {
$host='192.168.20.59';$port=1218; $auth=''; $charset='utf-8';
$this->httpsqs_host = $host;
$this->httpsqs_port = $port;
$this->httpsqs_auth = $auth;
$this->httpsqs_charset = $charset;
return true;
}      public function http_get($query)
{
$socket = fsockopen($this->httpsqs_host, $this->httpsqs_port, $errno, $errstr, 5);
if (!$socket)
{
return false;
}
$out = "GET ${query} HTTP/1.1\r\n";
$out .= "Host: ".$this->httpsqs_host."\r\n";
$out .= "Connection: close\r\n";
$out .= "\r\n";
fwrite($socket, $out);
$line = trim(fgets($socket));
$header="";
$header .= $line;
list($proto, $rcode, $result) = explode(" ", $line);
$len = -1;
while (($line = trim(fgets($socket))) != "")
{
$header .= $line;
if (strstr($line, "Content-Length:"))
{
list($cl, $len) = explode(" ", $line);
}
if (strstr($line, "Pos:"))
{
list($pos_key, $pos_value) = explode(" ", $line);
}
if (strstr($line, "Connection: close"))
{
$close = true;
}
}
if ($len < 0)
{
return false;
}
$body = fread($socket, $len);
$fread_times = 0;
while(strlen($body) < $len){
$body1 = fread($socket, $len);
$body .= $body1;
unset($body1);
if ($fread_times > 100)
{
break;
}
$fread_times++;
}
//if ($close) fclose($socket);
fclose($socket);
$result_array["pos"] = (int)$pos_value;
$result_array["data"] = $body;
return $result_array;
}      public function http_post($query, $body)
{
$socket = fsockopen($this->httpsqs_host, $this->httpsqs_port, $errno, $errstr, 1);
if (!$socket)
{
return false;
}
$out = "POST ${query} HTTP/1.1\r\n";
$out .= "Host: " . $this->httpsqs_host . "\r\n";
$out .= "Content-Length: " . strlen($body) . "\r\n";
$out .= "Connection: close\r\n";
$out .= "\r\n";
$out .= $body;
fwrite($socket, $out);
$line = trim(fgets($socket));
$header="";
$header .= $line;
list($proto, $rcode, $result) = explode(" ", $line);
$len = -1;
while (($line = trim(fgets($socket))) != "")
{
$header .= $line;
if (strstr($line, "Content-Length:"))
{
list($cl, $len) = explode(" ", $line);
}
if (strstr($line, "Pos:"))
{
list($pos_key, $pos_value) = explode(" ", $line);
}
if (strstr($line, "Connection: close"))
{
$close = true;
}
}
if ($len < 0)
{
return false;
}
$body = @fread($socket, $len);
//if ($close) fclose($socket);
fclose($socket);
$result_array["pos"] = (int)$pos_value;
$result_array["data"] = $body;
return $result_array;
}    public function put($queue_name, $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;
}          public function get($queue_name)
{
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=get");
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false)
{
return false;
}
return $result["data"];
}        public function gets($queue_name)
{
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=get");
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false)
{
return false;
}
return $result;
}            public function status($queue_name)
{
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=status");
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false)
{
return false;
}
return $result["data"];
}              public function view($queue_name, $queue_pos)
{
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=view&pos=".$pos);
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false)
{
return false;
}
return $result["data"];
}   public function reset($queue_name)
{
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=reset");
if ($result["data"] == "HTTPSQS_RESET_OK")
{
return true;
}
return false;
}  public function maxqueue($queue_name, $num)
{
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=maxqueue&num=".$num);
if ($result["data"] == "HTTPSQS_MAXQUEUE_OK")
{
return true;
}
return false;
}     public function status_json($queue_name)
{
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=status_json");
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false)
{
return false;
}
return $result["data"];
}      public function synctime($num)
{
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=httpsqs_synctime&opt=synctime&num=".$num);
if ($result["data"] == "HTTPSQS_SYNCTIME_OK")
{
return true;
}
return false;
}
}
?> 
<?phpinclude_once("httpsqs_client.php");
$httpsqs = new httpsqs();
$result = $httpsqs->put("city", date('Y-m-d H:i:s',time()));
echo $result;
echo "</br>";
$result = $httpsqs->get("city");
echo $result;
?>
<?php
include_once("httpsqs_client.php");
$httpsqs = new httpsqs($httpsqs_host, $httpsqs_port, $httpsqs_auth, $httpsqs_charset); /*
1. 将文本信息放入一个队列(注意:如果要放入队列的PHP变量是一个数组,需要事先使用序列化、json_encode等函数转换成文本)如果入队列成功,返回布尔值:true 如果入队列失败,返回布尔值:false
*/
$result = $httpsqs->put($queue_name, $queue_data); /*
2. 从一个队列中取出文本信息返回该队列的内容如果没有未被取出的队列,则返回文本信息:HTTPSQS_GET_END如果发生错误,返回布尔值:false
*/
$result = $httpsqs->get($queue_name); /*
3. 从一个队列中取出文本信息和当前队列读取点Pos返回数组示例:array("pos" => 7, "data" => "text message")如果没有未被取出的队列,则返回数组:array("pos" => 0, "data" => "HTTPSQS_GET_END")如果发生错误,返回布尔值:false
*/
$result = $httpsqs->gets($queue_name);/*
4. 查看队列状态(普通方式)
*/
$result = $httpsqs->status($queue_name);/*
5. 查看队列状态(JSON方式)返回示例:{"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10}
*/
$result = $httpsqs->status_json($queue_name);/*
6. 查看指定队列位置点的内容返回指定队列位置点的内容。
*/
$result = $httpsqs->view($queue_name, $queue_pos);/*
7. 重置指定队列如果重置队列成功,返回布尔值:true 如果重置队列失败,返回布尔值:false
*/
$result = $httpsqs->reset($queue_name);/*
8. 更改指定队列的最大队列数量如果更改成功,返回布尔值:true如果更改操作被取消,返回布尔值:false
*/
$result = $httpsqs->maxqueue($queue_name, $num);/*
9. 修改定时刷新内存缓冲区内容到磁盘的间隔时间如果更改成功,返回布尔值:true如果更改操作被取消,返回布尔值:false
*/
$result = $httpsqs->synctime($num);
?>

轻量级简单队列服务HTTPSQS安装与使用相关推荐

  1. Amazon Lambda支持以简单队列服务作为事件源了

    Amazon发布更新其简单队列服务(SQS)--开发人员现在可以使用SQS触发AWS Lambda函数了.而且,开发人员不再需要运行轮询服务或创建SQS到SNS的映射. \\ Amazon SQS是一 ...

  2. 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS

    [文章作者:张宴 本文版本:v1.3.1 最后修改:2010.08.26 转载请注明原文链接:http://blog.s135.com/httpsqs/] HTTPSQS(HTTP Simple Qu ...

  3. 轻量级对象存储服务minio安装及使用

    简介 Minio 是一个基于Apache License v2.0开源协议的对象存储服务,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器/虚拟机镜像等,而一个对象文件可以 ...

  4. SQS-简单队列服务

    因为我们新浪项目的需要,接触了一下SINA SQS(Sina Simple Queue Service ),使用它可以创建一个队列,然后从不同的地方往里面放东西,然后又可以在不同的地方不停的往外取东西 ...

  5. 尝试简单的队列服务(张宴的HTTPSQS)

    声明:本文主要内容摘自张宴的博客http://blog.s135.com/httpsqs/ 一.下载&编译&安装 注意:若在ubuntu下make和make install前别忘了加上 ...

  6. 【Docker】9、Docker-Compose安装轻量级分布式日志服务Graylog

    1.安装Docker-Compose 见博客:[Docker]8.安装Docker-Compose服务 2.Graylog简介 Graylog 是一个开源的日志聚合.分析.审计.展现和预警工具.在功能 ...

  7. 队列服务 php,php Redis 队列服务的简单示例

    本节内容: php调用redis提供队列服务. 例1,入队操作文件(enqueue.php): 复制代码 代码示例: $redis = new Redis(); $redis->connect( ...

  8. 构建自己的简单微服务架构(开源)

    构建自己的简单微服务架构(开源) 原文:构建自己的简单微服务架构(开源) 前言 本篇仅作引导,内容较多,如果阅读不方便,可以使用电脑打开我们的文档官网进行阅读.如下图所示: 文档官网地址:https: ...

  9. Windows下当地RabbitMQ服务的安装

    Windows下本地RabbitMQ服务的安装 本文参考:刘若泽相关技术文档 当然这些内容页可以通过RabbitMQ官方网站获得. RabbitMQ配置说明手册 一.RaibbitMQ服务器配置 1. ...

最新文章

  1. [译]Godot系列教程一 - 场景与节点
  2. 实战:基于深度学习和几何的3D边界框估计
  3. Java IDE鱼龙混杂,我们该如何选择呢?
  4. 【php7扩展开发五】函数调用
  5. Android中导入第三方jar
  6. binwalk 提取bootimg_boot.img格式文件结构解析
  7. SpringBoot2.1.5(16)--- Spring Boot的日志详解
  8. [Angular 2] Using events and refs
  9. Apache 配置多端口网站
  10. java 算法基础之三合并排序法
  11. 给英文文章加音标,建生词表
  12. Kafka Broker 总体工作流程
  13. 【离散数学】平凡子群
  14. 共享充电线项目市场分析报告
  15. 【Android进阶】20、音频播放:SoundPool 类、单元测试:Espresso框架
  16. 小程序仿学习强国填空题
  17. 工具-python包-虚拟环境管理(99.4.1)
  18. 傅立叶变换的原理、意义以及如何用Matlab实现快速傅立叶变换
  19. 2013-8-25 上周工作总结
  20. 外汇交易与实务--外汇交易市场

热门文章

  1. 切割图形_模型教程丨切割机使用——结合实例
  2. ue4 曲线图实现 蓝图_UE4蓝图解析(一)
  3. Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)
  4. autoware源码安装与运行ROSBAG示例(二)
  5. 0.基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速
  6. Linux那些事儿之我是Sysfs(3)设备模型上层容器
  7. kernfs_addrm_start kernfs_add_one
  8. 【opencv】(1) 基础操作:图像视频读取、图像截取、颜色通道
  9. 【开源方案共享】ORB-SLAM3开源啦!
  10. 使用 sched_setaffinity 将线程绑到CPU核上运行