KalonQue文档

*Php消息队列实现 队列的概念: 1、是队列结构的中间件 2、消息放入后不需要立即处理 3、由订阅者/消费者按顺序处理 队列原理: 也是解耦的原理:业务系统和队列处理系统没有关系 一个写(业务系统),一个读(队列管理系统)。 写的只管往队列里写,别的不用操心,读的能不能读完和写的也没有关系 同样,读的只管从队列里往外读,来活儿就干,没活儿歇着 应用场景: 冗余:持久化的存储在队列中,后续由订单... 阅读详情

1.关于KalonQue

    KalonQue一款完全基于PHP语言开发的队列软件产品。

队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。

通过KalonQue可以将复杂的业务同步转异步以及异步转同步:

 1.当业务由同步转为异步的时候,业务会拥有更高的处理效率,响应速度更快。

 2.当业务由异步转为同步的时候,可以在高并发高负载情况下使服务器维持在一个比较稳定的负载范围之内,不会因资源不足而崩溃。

    

2.KalonQue应用场景

   KalonQue一般应用在高负载高并发的http环境。

   场景:例如在一次web请求中,有n个业务操作。一般情况在LAMP环境下,这n个业务操作只能串行的处理。随着业务规模增长,n的值越来越大,响应本次请求的时间越来越长,用户体验越来越差,最终可能达到用户无法忍受的地步。

   解决:对n个业务操作我们可以进行简单的分类:

             1.实时性要求比较高的操作,我们称为前端操作

             2.实时性要求相对较低的操作,我们称为后端操作

             具体如何区分这两类操作,需要凭借开发者自己的经验和感觉,例如在博客系统中发博文的请求中,博文入库肯定是前段操作,这个操作需要在当前请求中立刻完成;记录用户发博文的日志记录我们可以认为是后端操作,因为此操作如果不在本次请求中完成也不会整个发博文请求造成影响。

             现在假设我们在前面n个业务操作中,分出了k个前段操作和m个后端操作。现在对于前面场景中提到的web请求做一次优化,请求会分为两个部分,第一个部分是k个前端操作,这些操作还是和之前一样串行完成,第二部分是m个后端操作,把这m个后端操作需要的原始数据以http(或则别的方式)发送到独立的队列服务器上,数据插入队列后立即返回,这m个后端操作最终会由队列服务器上的一个或则多个队列进程来处理。  由于将m个后端操作需要的原始数据发送到队列服务器的速度相当快,因此我们可以认为前面的web请求只需要执行k个前端操作,这样服务响应速度可以大幅提高。

    分析:从此场景我们可以看到前面提到并行和串行的相互转换过程:

      串行转并行:一次请求原本是串行处理n个操作,现在可以将n个操作中的k个前端操作和m个后端操作并行处理了,提高了服务效率。

      并行转串行:web前端在高并发的情况下,会对队列机有大量的入队列请求,但是最终队列处理的时候是从队头取数据逐条串行处理,这样即使在高并发高负载的情况下,队列机也不会崩溃。

   

     下图为此场景下服务整体结构图:

  

   

3.KalonQue运行环境

1.KalonQue运行在unix类操作系统

2.PHP解释器版本大于等于5,并且需要安装cli sapi(即PHP的命令行模式,默认安装) 

3.PHP解释器除了基本的扩展之外,还需要安装pcntl和posix扩展

 

4.KalonQue安装

    KalonQue是基于PHP语言开发,因此自身不需要编译和安装,但是需要安装PHP语言解释器才能使用KalonQue。可以到PHP官网 http://www.php.net/ 上下载最新的 PHP安装包编译安装。 下载号KalonQue软件包之后,解压拷贝到相关代码目录,具体可以按照如下步骤部署:

 1.例如将解压后的代码目录复制并重命名到 /usr/local/queue/Kalonque

 2.复制配置文件到Kalonque代码目录同级目录

    cp /usr/local/queue/Kalonque/conf/kalonque_config.php  /usr/local/queue/kalonque_config.php

 3.复制队列业务目录到Kalonque代码目录同级目录

    cp /usr/local/queue/Kalonque/business  /usr/local/queue/business -R

 

然后我们就可以开始使用KalonQue:

输入命令:   php /usr/local/queue/Kalonque/bin/kalonque.php -h

 

5.KalonQue工作方式

    KalonQue实质上是一个队列业务的运行载体,用户需要按照一定的规范来编写队列业务类,然后通过KalonQue来启动和停止队列业务进程。

    KalonQue提供了start(启动),stop(停止),restart(重启),invoke(唤醒),add(插入)等一系列指令来控制队列业务进程。 

    5.1 核心模块:

    1.Controller    控制器                 控制整个队列进程活动流程

    2.Business     队列业务逻辑     主要的队列业务逻辑,一般由用户自己编写业务类从基本业务类继承

    3.Store             队列数据存储     队列数据存取方式

    4.Monitor          队列进程监控      当有数据入队列的时候需要唤醒队列进程开始处理数据

    5.Plugin            队列插件              插件可以在不改变系统本身的情况下添加一些新的功能和特性

    5.2 队列启动:

    假设有一个名字为test的队列业务逻辑:

    1.Kalonque的start命令启动test队列后台守护进程

    2.记录守护进程的pid在一个特定的文件中

    3.初始化队列数据存储模块

    4.初始化队列进程监控模块

    5.控制器进入请求主循环,通过队列监控模块进程将保持睡眠或则阻塞状态

    6.监控唤醒队列进程,开始执行循环体,将出队列的原数据提交给test队列业务的处理部分,完成之后回到5

    

    5.3 队列停止:

    1.Kalonque的stop命令停止test队列后台守护进程

    2.读取test队列启动的时候保存在特定文件中的pid

    3.发送终止信号给test队列进程

    注意:队列停止分为普通模式和强制模式,当队列正在处理数据的时候,如果强制终止可能会让正在处理的数据丢失,普通模式能够等到队列处理完当前数据之后再停止。

 

    5.4 队列插入:

    1.Kalonque的add命令给test队列进行入队列操作,队列数据用-d xxxx参数指定数据内容

    2.通过队列存储将数据插入对立尾部

    3.通过Kalonque的invoke命令让队列监控唤醒队列进程

    4.队列进程唤醒之后进入循环体,从队头读数据处理

    5.队列再次进入睡眠或则阻塞状态,等待被监控唤醒

 

6.一个简单的队列业务:Test

    下面我们将给出一个最简单的队列业务例子:

  

6.1 创建队列业务类Test.php:

创建 Test.php:

<?php 
require_once  KALONQUE_BASE_PATH . '/Business/Default.php';

class KalonQueBusinessTest extends KalonQueBusinessDefault
{	
    public function _main()
    {
    	sleep(1);
        echo  __CLASS__ . " loaded data: " . $this->_DATA_LOAD . "\n";
    }
}
?>

将Test.php移动到前面我们设置的队列业务目录/usr/local/queue/business中,注意文件名不能更改,文件名Test.php必须和其中的类KalonQueBusinessTest的后缀Test保持一致。

 

6.2 启动队列test:

通过start操作启动Test队列业务:

 

看到这样的提示,就表示test队列业务已经启动成功。

队列业务名:test   守护进程pid:20492   启动时间: 2011-07-19 11:11:04

用ps命令查看进程是否在运行:

可以看到进程确实在后台运行。

 

6.3 数据入队列:

通过add操作将数据入队列:

 php /usr/local/queue/Kalonque/bin/kalonque.php add test -d 'this is the first  data'

 php /usr/local/queue/Kalonque/bin/kalonque.php add test -d 'this is the second data'

这样就将数据'this is the first  data'和'this is the second data' 两条数据插入test队列尾部了

 

6.4 唤醒队列:

通过invode操作将队列进程唤醒:

可以看到队列唤醒之后,Test.php中的_main()方法执行了两次,打印出了前面入队列的两条数据。

 

6.5 Test.php队列业务类说明:

require_once  KALONQUE_BASE_PATH . '/Business/Default.php';

这个是包含KalonQue核心代码中的默认队列业务类KalonQueBusinessDefault,这里已经定义好了所需要的方法。

KalonQueBusinessTest从KalonQueBusinessDefault继承而来,并且实现了主方法_main()。 _main()实际上是一个钩子方法,当队列被唤醒,并且队列非空的时候,此方法会被调用来执行用户的业务逻辑。

在_main()方法中使用了$this->_DATA_LOAD,此成员变量会由KalonQue自动初始化为当前出队列的数据,在_main()第一次调用的时候,$this->_DATA_LOAD 为 this is the first data,在_main()第二次调用的时候,$this->_DATA_LOAD 为 this is the second data。

 

7.通过HTTP服务进行数据入队列

队列服务通常会部署在独立的服务器上,因此需要提供一个服务接口可以接受数据入队列请求,通常情况下是以apache(或则别的web server)和PHP的组合来提供HTTP服务接口。下面给出一个服务例子:

创建kalonque_cgi.php文件:

<?php 
//包含Kalonque基础配置文件,这个会初始化一些非常重要的宏和变量
define("KALONQUE_PATH" , "/usr/local/queue/KalonQue");
require_once KALONQUE_PATH . '/conf/kalonque_base.php ';

//定义接口返回码
define('CODE_SUCCESS', 0);
define('CODE_FAILED',  1);

$business = $_GET['name'];
$item     = $_GET['data'];
if (empty($business) || empty($item)) {
	show(CODE_FAILED, 'params error');
}

try {
    //创建控制器
    require_once KALONQUE_BASE_PATH . '/Controller/Default.php';
    $controller = new KalonQueControllerDefault($KALONQUE_CONF);
    
    //设置队列业务名
    $controller->setBusiness($business);
    
    //插入数据到队尾
    $controller->addStoreItem($item);
    
    //监控唤醒队列进程
    $controller->updateMonitor();
} catch (Exception $e) {
    show(CODE_FAILED, $e->getMessage());    
}

show(CODE_SUCCESS);

function show($code, $msg = '')
{
	echo $code . ' ' . $msg;
	exit;
}
?>


假设部署队列的服务器域名为 queueserver.com,将kalonque_cgi.php放到APACHE的web根目录下,于是可以通过以下方式访问:

  http://queueserver.com/kalonque_cgi.php 

如果希望给test队列添加一条数据,客户端(例如web前端机)可以通过以下HTTP请求完成。

 http://queueserver.com/kalonque_cgi.php ?name=test&data=this_is_data_from_cgi

在kalonque_cgi.php中主要做了以下工作:

1.加载KalonQue基础配置文件

2.提取CGI参数,主要包括队列名和入队列数据

3.新建一个KalonQue控制器实例

4.控制器根据CGI参数设置队列名

5.控制器根据CGI参数设置要入队列的数据

6.控制器通过监控唤醒队列进程

7.返回结果

 

 下载地址暂不提供。。。

 

kaggle:Digit Recognizer《手写数字识别》你的第一个图像识别竞赛项目 新手,入门,巩固复习,深度学习,图像识别 阅读详情

相关推荐

如何在PHP中实现队列(Queue)?

上述方法中,选择适合您需求的方式,并根据需要实现适当的功能和安全性措施。如果需要处理大量的队列元素或需要更高级的队列功能,考虑使用专门的队列服务或第三方库,如RabbitMQ、Redis队列或Beanstalkd。如果需要持久化队列数据,您可以使用数据库表来实现队列。创建一个表来存储队列的元素,并使用SQL操作来入队和出队元素。这是一种简单的队列实现方法,适用于小型队列。您可以使用PHP的数组来模拟队列。类,它是一个双向队列,可以用作队列。函数将元素添加到队列的尾部,使用。方法添加元素到队列的尾部,使用。

周祥平程序专栏 2952

CTFshow-pwn入门-前置基础pwn32-pwn34

CTFshow-pwn入门-前置基础pwn32-pwn34

你们de4月天的博客 1132

PHP语言的队列

队列是一种线性数据结构,它按照特定的顺序存储数据。入队(Enqueue):将元素添加到队列的末尾。出队(Dequeue):从队列的前端移除元素并返回该元素。查看队列头部(Front):查看队列最前面的元素。判断队列是否为空(isEmpty):检查队列是否为空。除了使用PHP内置的数组或者SplQueue,我们还可以根据需要自定义队列的实现。例如,可以用链表来实现队列,这样可以更高效地管理内存。```phpif (!if (!if (!```

2501_91241525的博客 1002

使用TinyProxy搭建代理服务器

背景 办公电脑所在网络无法连接外网,机房服务器可以连接外网,通过服务器代理上网; 一、CentOS下TinyProxy安装–搭建代理服务器 TinyProxy是个轻量级简单的HTTP/HTTPS代理程序,GitHub和官网,安装方式这里主要介绍两种 CentOS下yum安装,参考:TinyProxy安装 Docker安装 先安装docker环境yum install docker -y 二、Win10下使用 ...

椰汁菠萝 1万+

sentaurus学习笔记(HFET_pGate_GaN仿真)(五)

`(sdedr:define-constant-profile`和`(sdedr:define-constant-profile-region`命令用于定义并应用一个恒定的活性硼掺杂浓度剖面`"ndop_GaN_gate_const"`到氮化镓栅极层上,其值为`NpGaN_gate`。- `"Oxide"`指定了这一层的材料名称(在这里代表氧化层),而`"nucleation"`是这一层在仿真中的标识名称。- `"GaN"`指定了这一层的材料名称,而`"GaN_gate"`是这一层在仿真中的标识名称。

qq_52640792的博客 940

PHP数据结构之队列

队列是数据结构中的重要组成部分,尤其在多线程处理、任务调度和消息队列系统中发挥着关键作用。关于我们本文由ChatMoney团队出品,ChatMoney专注于AI应用落地与变现,我们提供全套、持续更新的AI源码系统与可执行的变现方案,致力于帮助更多人利用AI来变现,欢迎进入ChatMoney获取更多AI变现方案!

likeshopgood的博客 980

U8-固定资产月末结账报错:BOF或EOF中有一个是真

度了下,发现此问题一般是由于fa_Vtsobject表缺少对应月份的记录导致,补上即可,但是查看发现此表记录正常。 跟踪后发现定位到以下语句: select * from AccInformation where cSysID = N'FA' and cName =N'bVoucherApply'上述语句执行后没有任何记录显示,但是在正常的账套执行是有记录的,那有可能就是记录丢失导致,执行以下

guizhouakun的博客 5917

thinkphp5的消息队列详细教程

消息队列的概念、原理和场景 在高并发的时候,程序往往无法做到及时的处理。我们引入一个中间的系统,来进行分流和减压。 所以从本质上讲:消息队列就是一个队列结构的中间件。也就是说,你把消息和内容放入这个容器之后就可以直接返回,不用等它后期处理的结果。另外会有一个程序,读取这些数据并按照顺序处理。 1、队列结构的中间件 2、消息放入后,不必立即处理 3、由订阅者/消费者按顺序处理 也就是说:当遇到一个比较大或者耗时比较长的环节的时候,而同时你的业务又不需要立即知道这个环节的结果,使用消息队列是好的选择。 知识付费

CRMEB小程序商城的博客 4742

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3657

会话管理技巧——如何优化OpenClaw的上下文理解能力(2026进阶版)

本文深入探讨了OpenClaw系统的会话管理技术,重点介绍了会话定义、生命周期管理和上下文优化策略。会话管理包含会话ID、用户信息、状态等核心要素,以及创建、维护、终止和恢复四个生命周期阶段。上下文管理通过ContextManager类实现,支持创建、更新、消息添加和变量管理等功能,并采用历史记录机制确保会话连续性。ContextOptimizer类则负责应用优化规则,通过消息和变量压缩等技术提升系统性能。这些技术共同构建了OpenClaw强大的会话管理能力,为AI助手提供了高质量的交互体验基础。

博客 491

ThinkPHP 6.1 队列使用

在项目中通常有一些业务,需要执行的时间比较长并且不需要即时得到结果的业务,我们一般使用队列异步来执行。

json_li的博客 3813

【SpringBoot 4.x 第29节】Spring Security 7 入门:先理解认证和授权!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 553

php 队列实现

1.PHP 简单队列 //数组 $array = array('php','java'); //入队列 array_push 数组尾部插入元素 array_push( $array, 'python' ); //输出数组 print_r($array); //array('php','java','python') //出队列 array_shift //数组头部剔除元素 array_shift( $array ); //输出数组 print_r($array);

懒人博客 1515

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

php谈谈你对消息队列的理解,PHP PDO和消息队列的个人理解与应用实例分析

本文实例讲述了PHP PDO和消息队列的个人理解与应用。分享给大家供大家参考,具体如下:什么是消息队列,百度百科说,···消息队列····是在消息的传输过程中保存消息的容器。看着网上林林总总的文章,都说是为了应对高并发,处理数据量超级大的一种数据容器,也可以说是利用各种方式,先把数据存储在一个···容器···中,然后,再慢慢从这个容器中获取数据,实现·····异步操作数据库·····的方式,以便降...

weixin_42126865的博客 501

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

php成熟的队列,PHP队列你一定用的到

PHP队列简单介绍什么是队列,是先进先出的线性表,在具体应用中通常用链表或者数组来实现,队列只允许在后端进行插入操作,在前端进行删除操作。 什么情况下会用了队列呢,并发请求又要保证事务的完整性的时候就会用到队列,当然不排除使用其它更好的方法。 队列还可以用于减轻数据库服务器压力,我们可以将不是即时数据放入到队列中,在数据库空闲的时候或者间隔一段时间后执行。 比如访问计数器,没有必要即时的执行访问增...

weixin_29861235的博客 1021

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

php队列数据结构,PHP实现队列(Queue)数据结构

队列(Queue),是一种特殊的先进先出线性表,其只能在前端进行删除操作(一般称为出队),在后端进行插入操作(一般称为入队)。进行删除操作的端称为队头,进行插入操作的端称为队尾。队列,是按照先进先出或后进后出的原则组织数据。当队列中没有元素时,队列(Queue),是一种特殊的先进先出线性表,其只能在前端进行删除操作(一般称为出队),在后端进行插入操作(一般称为入队)。进行删除操作的端称为队头,进行...

weixin_39907316的博客 316

think-queue

参考资料 官方文档 https://github.com/coolseven/notes/tree/master/thinkphp-queue think-queue是ThinkPHP官方提供的一个消息队列服务,是专门支持队列服务的扩展包。think-queue消息队列适用于大并发或返回结果时间比较长且需要批量操作的第三方接口,可用于短信发送、邮件发送、APP推送。think...

JunChow 1134

php 消息队列_在什么场合里,你会使用PHP消息队列呢

1. 什么是消息队列消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式2. 为什么使用消息队列消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读出。通过消息队列,应用程序可独立地执行,它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。3. 什么场合使用消息队列你首先需要弄清楚,消...

weixin_40000999的博客 327

PHP实现分布式任务队列系统(基于Redis)

PHP实现分布式任务队列系统(基于Redis)

安 1354

Thinkphp6使用RabbitMQ消息队列

Thinkphp6连接使用RabbitMQ(不止tp6,其他框架对应改下也一样),如何使用Docker部署RabbitMQ,在上一篇已经讲了。

骷大人的博客 3633

PHP使用Redis实战实录5:Redis实现消息队列

PHP使用Redis实战实录系列。

挖掘大数据价值,让决策者快速洞悉趋势,让大众读懂数据背后的故事。 1748

php什么是队列,什么是队列?

队列是一种操作受限制的线性表,进行插入操作的端称为队尾,进行删除操作的端称为队头。或者队列是一种军事用语,通常由队列条令予以规定,用于规范部队、分队队列及其在各种条件下的运动队形和动作,并按条令规定组织和实施训练。队列 (常用数据结构之一)队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。...

weixin_35278163的博客 423

如何使用PHP和RabbitMQ实现消息队列?

用PHP和RabbitMQ实现消息队列功能,其实也不复杂,主要有以下几个步骤。1、安装RabbitMQ。2、安装PHP的AMQP扩展。3、编写生产者、消费者进行验证。上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做配置化、封装。

zhangbin1988的专栏 2158

PHP 实现简易延时队列

php 实现延时队列,数据库的设计、队列服务。

Zzane 1134

php laravel5.5使用rabbitmq消息队列

博主看了一些消息队列,大多数消息队列都没有对 php 比较友好的 SDK,这边 rabbitmq 算是一个不错的消息队列,给大家介绍一下在 Laravel 中如何使用。安装rabbitmq和amqpdocker pull rabbitmq:3.8.3-management docker run -d --hostname my-rabbit --network ...

博客简介 2516
上一篇: KalonDaemon - 守护进程PHP版
下一篇: PHP多线程版本HASH漏洞攻击工具
phpkernel
博客等级 码龄16年 96粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值