PHP队列服务HTTPSQS的安装和使用实例

 更新时间:2016年11月25日 15:35  点击:2048
HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储

HTTPSQS(HTTP Simple Queue Service)是一个基于HTTP GET/POST请求的简单队列服务。

PHP队列服务HTTPSQS的安装和使用


PHP队列服务HTTPSQS的安装和使用

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

HTTPSQS 具有以下特征:

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

HTTPSQS使用示例:

//生成对账单
public function create_dzd()
{
    $sl_id = I('get.sl_id','','intval');
    $sl_uid = I('get.sl_uid','','intval');
 
    $this->send_task->startTrans();//开启事务
 
    $data['st_params'] = $sl_id;
    $data['st_seller_id'] = $sl_uid;
    $data['st_type'] = 3;
    $data['st_add_time'] = time();
    $data['st_success'] = 1;//1后台生成对账单
    $data['st_is_compelete'] = 0;
    $data['st_ip'] = get_client_ip(1);
    $id = $this->send_task->add($data);
    if($id){
        $httpsqs = $this->getHttpsqs();
        $name = self::EXPORT_RECORD;
        $rs = $httpsqs->put($name, $id);
        if($rs){
            $this->send_task->commit();
            $this->ajaxReturn(array('code'=>0, 'msg'=>'已经开始生成!'));
        }else{
            $this->send_task->rollback();
            $this->ajaxReturn(array('code'=>2, 'msg'=>'生成对账单失败'));
        }
    }else{
        $this->ajaxReturn(array('code'=>3, 'msg'=>'生成对账单失败'));
    }
}

这就是一个队列的应用,生成对账单,入队列,同时把记录写入到一张表记录。另一个java脚本读取队列,进行处理,更新记录。

HTTPSQS封装在一个类中,调用的时候这样调用:


//初始化队列服务
private function getHttpsqs()
{
    import("COM.Httpsqs");
    $httpsqs = new Httpsqs("192.168.1.8", 1218, "dafadsfasfsadfsa", 'utf-8');
    return $httpsqs;
}
但是要使用HTTPSQS,必须有一台队列服务器,这个服务器装了队列服务。

以上初始化队列,也指定了ip,端口,来连接队列服务器,才能进行队列的操作。

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 ../
更具体的服务器端HTTPSQS队列服务的安装和编译,参考:https://code.google.com/p/httpsqs/

PHP 7新特性有那些?PHP 7新特性主要是在性能上提升了不少了,我们可以不使用php加速插件只要使用PHP 7即可达到加速性能了,真是这样吗?我们来看看PHP 7新特性有哪些。


PHP 7在性能方面的突破成为近来最热门的话题之一,目前官方PHP 7.0.0 Beta 2已经发布
新特性
性能提升:PHP 7要比PHP 5.6快两倍
全面一致的64位支持
移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展
新增了空接合操作符(??)【wiki】

$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

新增加了结合比较运算符(<=>)【wiki】

$a = 1;
$b = 2;
 
switch ($a  <=> $b)
{
    case 1:
        echo "a > b";
        break;
    case 0:
        echo "a == b";
        break;
    case -1:
        echo "a < b";
        break;
}

新增加了函数的返回类型声明【wiki】

function foo(): array {
    return [];
}

新增加了标量类型声明【wiki】

//标量声明的主要作用是自动实现参数的强制类型转换
//变量类型声明(int, float, string , bool)
function add(int $a, int $b): int {
    return $a + $b;
}

新增加匿名类【wiki】

class Foo {}
$child = new class extends Foo {};
var_dump($child instanceof Foo); // true

可捕获致命错误,较早版本只能通过register_shutdown_function()事后处理。(wiki)

Benchmark
测试代码:
$count = $argv[1];
 
$a = array();
for ($i = 0; $i < $count; $i++) {
    $a[$i] = $i;
}
 
foreach ($a as $i) {
    array_key_exists($i, $a);
}

测试效果如下

可见PHP 7相对于PHP 5.4有数倍以上的速度提升。


社区中的Benchmark结果:


以WordPress开源博客首页为测试场景的测试结果:

匿名函数小编使用得非常的少了在开发时一般用不到php匿名函数了,但在js中匿名函数用到比较多了,下文我来为各位介绍php中匿名函数用法。


PHP5.3起就支持匿名函数,可以放心在生产环境中使用,对于PHP的很多新特性该用的地方要大胆使用,可以使代码更简洁,功能实现也更加方便。

以下是PHP匿名函数的一个小的简单实例:

 

function func($list,$u_wangwang)
{
    //匿名函数,获取其他行联号
    $other_num = function($num){
        $num = explode('.', $num);
        return $num[0];
    };
    $res = $other_num($v['sb_other_num']);
    return $res;
}

首先在方法里定义了一个匿名函数,有一个参数,然后调用的时候进行传参。


HP中, 传递Callback的方式, 一直很丑陋. 在PHP5.3以前, 我们只有俩种选择:

1. 字符串的函数名
2. 使用create_function的返回值
在PHP5.3以后, 我们多了一个选择, 也就是Closure,

$func = function () { ... };
array_walk($arr, $func);
从实现上来说, 第一种方式: 传递函数名字符串是最简单的.

而第二种方式create_function, 其实和第一种方式本质上一样的, create_function返回一个字符串的函数名, 这个函数名的格式是:

"\000_lambda_" . count(anonymous_functions)++;
我们来看看create_function的实现步骤:

1. 获取参数, 函数体
2. 拼凑一个"function __lambda_func (参数) { 函数体;} "的字符串
3. eval之
4. 通过__lambda_func在函数表中找到eval后得到的函数体, 找不到就出错
5. 定义一个函数名:"\000_lambda_" . count(anonymous_functions)++
6. 用新的函数名替换__lambda_func
7. 返回新的函数名
我们来验证下:

<?php
create_function("", 'echo __FUNCTION__;');
call_user_func("\000lambda_1", 1);
?>
//输出
__lambda_func
因为在eval的时候, 函数名是”__lambda_func”, 所以匿名函数内会输出__lambda_func, 而因为最后用”\000_lambda_” . count(anonymous_functions)++重命名了函数表中的”__lambda_func”函数, 所以可通过”\000_lambda_” . count(anonymous_functions)++调用这个匿名函数.

为了证实这一点, 可以将create_function的返回值dump出来查看.

而在PHP5.3发布的时候, 其中有一条new feature就是支持闭包/Lambda Function, 我第一反应是以为zval新增了一个IS_FUNCTION, 但实际上是构造了一个PHP5.3引入的Closure”类”的实例, Closure类的构造函数是私有的, 所以不能被直接实例化, 另外Closure类是Final类, 所以也不能做为基类派生子类.

//php-5.3.0
$class = new ReflectionClass("Closure");
var_dump($class->isInternal());
var_dump($class->isAbstract() );
var_dump($class->isFinal());
var_dump($class->isInterface());
//输出:
bool(true)
bool(false)
bool(true)
bool(false)
?>

而PHP5.3中对闭包的支持, 也仅仅是把要保持的外部变量, 做为Closure对象的”Static属性”(并不是普通意义上的可遍历/访问的属性).

//php-5.3.0
$b = "laruence";
$func = function($a) use($b) {};
var_dump($func);
/* 输出:
object(Closure)#1 (2) {
  ["static"]=>
  array(1) {
    ["b"]=>
    string(8) "laruence"
  }
  ["parameter"]=>
  array(1) {
    ["$a"]=>
    string(10) "<required>"
  }
}
*/
这个实现, 个人认为和JS对闭包的支持比起来, 还是有些太简陋了~

在php中验证日期我们有许多的一方法了,像有data函数有一个可以判断是不是日期了,同时也可以使用正则之类的命令,具体如下。

可以用strtotime()把日期($date)转成时间戳,再用date()按需要验证的格式转成一个日期,来跟$date比较是否相同来验证这个日期的格式是否是正确的。

正则验证日期格式


$dateTime=”2010-6-4 00:00:00″;
if(preg_match(“/^d{4}-d{2}-d{2} d{2}:d{2}:d{2}$/s”,$dateTime))
{
echo “Yes”;
}else{
echo “No”;
}

例子

/*
* 方法 isDate
* 功能 判断日期格式是否正确
* 参数 $str 日期字符串
$format 日期格式
* 返回 无
*/
function is_Date($str,$format='Y-m-d'){
    $unixTime_1=strtotime($str);
    if(!is_numeric($unixTime_1)) return false; //如果不是数字格式,则直接返回
    $checkDate=date($format,$unixTime_1);
    $unixTime_2=strtotime($checkDate);
    if($unixTime_1==$unixTime_2){
        return true;
    }else{
        return false;
    }
}

注意以上判断方法对一般的要求足够了,但不是非常严格,对于 2012-03-00 或 2012-02-31 这种格式的日期也会返回 true,本人一直没有找到更好的解决办法

以下代码验证日期是否为2015-08-11 20:06:08的形式:

<?php
 header("Content-type:text/html;charset=utf-8");
 $date = '2015-08-11 20:06:08';
 if( date('Y-m-d H:i:s', strtotime($date))  == $date )
 {
  echo 'yes';
 }
 else
 {
  echo 'no';
 }
?>

所以要验证日期格式是否为2015-08-11,可以改成if( date('Y-m-d', strtotime($date))  == $date )来判断,验证其他格式,以此类推。

我们在php中上传文件最多使用ftp来,但curl也是可以实现的这样不需要ftp即可直接上传了,下面一起来看看PHP使用CURL向远程服务器上传图片的原理吧。


如果图片等资源服务器是远程的,图片上传可以通过cURL方式传到远程服务器,本文简单介绍PHP使用cURL向远程服务器上传图片的原理。


通过cURL传送图片代码片段:


$data = array('img'=>'@'. dirname(__FILE__).'/img/1.jpg');

注意,PHP5.5后不能使用@表示文件。

在文件名前加上@语法表示上传文件,这在PHP5.3中是正常的,但是在PHP5.6中彻底废除了@语法,导致上传图片无法使用。


//支持远程文件上传
if(empty($urlinfo['host'])){
    $tmp_name=dirname($file['tmp_name']).'/'.$file['title'].'.'.$file['extension'];//加上文件后缀
    rename($file['tmp_name'],$tmp_name);
    $fields['file'] = '@'.$tmp_name;//加@符号curl就会把它当成是文件上传处理
}else{
    $fields['url']=$file['tmp_name'];
}

第5行,在文件名前加上@符合,curl会把它当作文件上传处理,这在PHP5.3中是正常的。cURL上传文件代码如下:


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$this->config['postUrl']);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //连接超时
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
$data=curl_exec ($ch);
$info=curl_getinfo($ch);
curl_close($ch);

在PHP5.6中,curl中CURLOPT_POSTFIELDS参数这样写表示上传文件:


curl_setopt(ch, CURLOPT_POSTFIELDS, [
    'file' => new CURLFile(realpath('image.png')),
]);

CURLFile方法是在PHP5.5中新加的,在PHP5.6中彻底废除了@语法,因此要么使用PHP5.3的方式,要么使用PHP5.6的方式,两者只能选其一,不能兼容。实在没办法,可以用:


if (version_compare(phpversion(), '5.4.0') >= 0)

这个函数来判断PHP版本选择不同的方式,但是这种方式不推荐,还是统一环境最好。

如果一定要兼容不同版本的PHP,参考以下写法:


if(empty($urlinfo['host'])){
    $tmp_name=dirname($file['tmp_name']).'/'.$file['title'].'.'.$file['extension'];//加上文件后缀
    rename($file['tmp_name'],$tmp_name);
    if(version_compare(phpversion(),'5.5.0') >= 0 && class_exists('CURLFile')){
        $fields['file'] = new CURLFile(realpath($tmp_name));
    }else{
        $fields['file'] = '@'.$tmp_name;//加@符号curl就会把它当成是文件上传处理
    }
}else{
    $fields['url']=$file['tmp_name'];
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$this->config['postUrl']);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //连接超时
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
$data=curl_exec ($ch);
$info=curl_getinfo($ch);
curl_close($ch);

 

然后远程服务器上up.php接受请求保存图片的代码片段示例:

 

if($_FILES){
  $filename = $_FILES['img']['name'];
  $tmpname = $_FILES['img']['tmp_name'];
  if(move_uploaded_file($tmpname,dirname(__FILE__).'/upload/'.$filename)){
     echo json_encode('上传成功');
  }else{
     $data = json_encode($_FILES);
     echo $data;
 }
}
它实际上跟本地传文件原理是一样的,只是通过cURL把文件传送过去,还是使用$_FILES来接收文件进行保存。

[!--infotagslink--]

相关文章

  • PHP7快速编译安装的步骤

    编译安装非常的简单了我们现在的php版本已经到了php7了,下文小编来为各位介绍一篇关于PHP7快速编译安装的步骤,希望文章能够帮助到各位。 一、安装必要一些依赖 yum...2016-11-25
  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • Rstudio中安装package出现的问题及解决

    这篇文章主要介绍了Rstudio中安装package出现的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • PHP编译安装后PHP-FPM使用笔记

    PHP-FPM我们相信各位用高版本的php经常使用到了,下面整理了一些关于PHP-FPM的笔记,有兴趣的可进来看看。 今天赶上了123System OPenVZ VPS全场半价的机会,购入了一...2016-11-25
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • 通过两种方式增加从库――不停止mysql服务

    一般在线增加从库有两种方式,一种是通过mysqldump备份主库,恢复到从库,mysqldump是逻辑备份,数据量大时,备份速度会很慢,锁表的时间也会很长。另一种是通过xtrabackup工具备份主库,恢复到从库,xtrabackup是物理备份,备份速度快...2015-11-08
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • Linux安装Pytorch1.8GPU(CUDA11.1)的实现

    这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-25
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • vscode安装git及项目开发过程

    这篇文章主要介绍了vscode安装git及项目开发过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-19
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25