PHP实现队列的原理

关于的队列的介绍,我这里就不多讲了,随便百度一下都很多

用过laravel框架的童鞋都知道其自带队列功能,之前我很费解,PHP只是一个脚本,有超时机制,为什么能不停的去执行队列呢?

带着这个问题,在网上找了一下相关的介绍,这里我没有研究透laravel的队列,而且用这么高大上的实例来给大家讲,我估计自己都云里雾里

所以我就其原理说明一下

我们新建一个文件queue

<?php
while(true){
  echo 1;
  sleep(1);
}

然后中 命令行里面 执行 php queue

你会发现每秒钟输出一个1;等了很久,咦,很神奇,为什么php没有超时呢?

对,就是不会超时【具体的百度吧】

ps -ef|grep php

会发现有一个 php queue进程



php超时的疑惑我们解决了

再来看一下队列的原理

新建一个文件 artisan

<?php
$redis = new Redis();
$redis->connect(‘127.0.0.1‘,6379);
while(1){
        $res = $redis->lpop(‘listname‘);
        if($res){echo $res."\r\n";}
        sleep(1);
}

然后php artisan 执行队列

新建一个窗口,我们进入redis客户端输入以下命令【不会redis的可以在我的博客中找相关资料】

lpush listname a b c d e f g

会发现php artisan这个队列会不断的把redis的列表里的值打出来

其实laravel的队列就是这个原理,只不过,它不仅支持redis作为载体,还可以使用其他更多的数据库



有人就要问了,我这php artisan启动了,如果我把窗口关了不就没用了吗,

不不不,Linux 还是可以在后台运行的

只要在命令后面加个 &

php artisan &

就可以啦

时间: 2024-10-12 16:55:02

PHP实现队列的原理的相关文章

JUC源码分析-集合篇(五)BlockingQueue 阻塞式队列实现原理

JUC源码分析-集合篇(五)BlockingQueue 阻塞式队列实现原理 以 LinkedBlockingQueue 分析 BlockingQueue 阻塞式队列的实现原理. 1. 数据结构 LinkedBlockingQueue 和 ConcurrentLinkedQueue 一样都是由 head 节点和 last 节点组成,每个节点(Node)由节点元素(item)和指向下一个节点(next)的引用组成,节点与节点之间就是通过这个 next 关联起来,从而组成一张链表结构的队列.默认情况下

Netty构建分布式消息队列实现原理浅析

在本人的上一篇博客文章:Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇 中,重点向大家介绍了AvatarMQ主要构成模块以及目前存在的优缺点.最后以一个生产者.消费者传递消息的例子,具体演示了AvatarMQ所具备的基本消息路由功能.而本文的写作目的,是想从开发.设计的角度,简单的对如何使用Netty,构建分布式消息队列背后的技术细节.原理,进行一下简单的分析和说明. 首先,在一个企业级的架构应用中,究竟何时需引入消息队列呢?本人认为,最经常的情况,无非这几种:做业务解耦.事件

Java阻塞队列实现原理分析-ArrayBlockingQueue和LinkedBlockingQueue

Java中的阻塞队列接口BlockingQueue继承自Queue接口. BlockingQueue接口提供了3个添加元素方法. add:添加元素到队列里,添加成功返回true,由于容量满了添加失败会抛出IllegalStateException异常 offer:添加元素到队列里,添加成功返回true,添加失败返回false put:添加元素到队列里,如果容量满了会阻塞直到容量不满 3个删除方法. poll:删除队列头部元素,如果队列为空,返回null.否则返回元素. remove:基于对象找到

浅谈消息队列的原理及优势

什么是消息队列这样的场景你一定不陌生:小王到M记点餐之后,服务员给了他一个号牌,并让他在柜台桌子前方等待叫号取餐.每个人都按照自己付款拿到的号牌顺序排队等叫号.即使店里人再多,也不会显得没有秩序.在上述场景中,柜台其实就充当了一个消息队列(Message Queue).小王等生产者把订餐的消息发送到柜台即消息队列里,又从其中取了餐即消费了消息,可以说这就是消息队列的一个完整走向--消息被发送到队列中,又成功被消费者消费."消息队列"是在消息的传输过程中保存消息的容器,队列的主要目的是提

消息队列工作原理

MessageQueue是消息机制中存储Message的一个队列.但是MessageQueue并不是队列,而是使用一个单链表来实现的.核心方法是入队enqueueMessage()与出队next()方法. 一.enqueueMessage() boolean enqueueMessage(Message msg, long when) { if (msg.target == null) { throw new IllegalArgumentException("Message must have

数据结构(3):队列的原理和实现

完整代码拉到最底下 一.介绍 队列顾名思义就像我们生活中排队一样,先进先出. 如上图所示,25.16.5.9依次在队列中,按照顺序拿出的数据也分别是25.26.5.9. 二.实现过程及思路 底层使用数组来实现,实现的功能有插入数据到队尾.移除队首数据.查看队首数据.判断队列是否为空.判断队列是否存满. 将队列的元素存储在数组的某个区间内,队列在数组中是连续的,所以使用变量标记队列在数组中的位置. 1.编写类及属性 我们可以使用elements变量标记队列中元素的数量,使用front变量标记队首元

linux内核无锁缓冲队列kfifo原理

Linux kernel里面从来就不缺少简洁,优雅和高效的代码 比如,通过限定写入的数据不能溢出和内存屏障实现在单线程写单线程读的情况下不使用锁.因为锁是使用在共享资源可能存在冲突的情况下.还用设置buffer缓冲区的大小为2的幂次方,以简化求模运算,这样求模运算就演变为 (fifo->in & (fifo->size - 1)).通过使用unsigned int为kfifo的下标,可以不用考虑每次下标超过size时对下表进行取模运算赋值,这里使用到了无符号整数的溢出回零的特性.由于指

阻塞队列

在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(LinkedList是双向链表,它实现了Dequeue接口). 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦.但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素.当队列中有元素后,被阻塞的线程会自动被唤醒

Java并发编程:阻塞队列

在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便.今天我们来讨论另外一类容器:阻塞队列. 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(LinkedList是双向链表,它实现了Dequeue接口). 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者