当前位置:首页 > PHP

php 队列实现

2026-02-14 12:01:11PHP

队列数据结构基础

队列是一种先进先出(FIFO)的线性数据结构,包含两个主要操作:入队(enqueue)在队尾添加元素,出队(dequeue)从队头移除元素。PHP中可通过数组或链表实现。

基于数组的队列实现

使用PHP数组模拟队列,需注意数组操作效率:

class ArrayQueue {
    private $queue = [];

    public function enqueue($item) {
        array_push($this->queue, $item);
    }

    public function dequeue() {
        if ($this->isEmpty()) {
            return null;
        }
        return array_shift($this->queue);
    }

    public function isEmpty() {
        return empty($this->queue);
    }

    public function size() {
        return count($this->queue);
    }
}

数组实现的array_shift操作时间复杂度为O(n),因需要重新索引剩余元素。

高效的双指针数组队列

通过维护头尾指针减少重新索引开销:

class OptimizedArrayQueue {
    private $queue = [];
    private $head = 0;
    private $tail = 0;

    public function enqueue($item) {
        $this->queue[$this->tail++] = $item;
    }

    public function dequeue() {
        if ($this->isEmpty()) {
            return null;
        }
        $item = $this->queue[$this->head];
        unset($this->queue[$this->head++]);
        return $item;
    }

    public function isEmpty() {
        return $this->head >= $this->tail;
    }
}

此实现使dequeue操作变为O(1),但可能造成内存浪费,需定期压缩数组。

链表实现队列

SplDoublyLinkedList提供高效实现:

class LinkedListQueue {
    private $list;

    public function __construct() {
        $this->list = new SplDoublyLinkedList();
    }

    public function enqueue($item) {
        $this->list->push($item);
    }

    public function dequeue() {
        return $this->list->shift();
    }

    public function isEmpty() {
        return $this->list->isEmpty();
    }
}

链表实现所有操作均为O(1)时间复杂度,适合高频队列操作场景。

PHP标准库解决方案

SplQueue是标准库提供的队列实现:

$queue = new SplQueue();
$queue->enqueue('a');  // 入队
$queue->dequeue();      // 出队
$queue->isEmpty();      // 检查空队列

SplQueue继承自SplDoublyLinkedList,提供完整的队列接口。

阻塞队列实现

使用swoole或workerman实现协程阻塞队列:

$chan = new Swoole\Coroutine\Channel(10);
go(function() use ($chan) {
    $chan->push('data');
});
go(function() use ($chan) {
    $data = $chan->pop();
});

适用于需要等待队列元素的并发场景。

优先级队列实现

SplPriorityQueue提供优先级队列功能:

$pq = new SplPriorityQueue();
$pq->insert('task1', 3);
$pq->insert('task2', 1);
$pq->extract(); // 返回优先级最高的'task1'

通过比较器可实现复杂优先级逻辑。

持久化队列方案

使用数据库或Redis实现持久化:

// Redis实现示例
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->rPush('queue', 'item1');
$item = $redis->lPop('queue');

适合需要消息持久化的分布式系统场景。

php    队列实现

性能优化建议

高频队列操作场景应避免使用纯数组实现,优先考虑SplQueue或链表结构。对于百万级数据量,需评估内存使用情况,必要时采用分块存储策略。

标签: 队列php
分享给朋友:

相关文章

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart/…

php实现一个

php实现一个

PHP 实现一个简单的计算器 创建一个基本的计算器,支持加、减、乘、除运算。以下是一个完整的实现代码示例: <?php $result = ""; if ($_SERVER["REQUES…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…