php队列的实现
PHP队列的实现方式
PHP中实现队列可以通过多种方式,包括数组、数据库、Redis或专业队列系统如RabbitMQ。以下是几种常见方法:
基于数组的队列
PHP数组本身支持队列操作,使用array_push和array_shift函数:
$queue = [];
array_push($queue, 'item1'); // 入队
$item = array_shift($queue); // 出队
SplQueue类 PHP标准库提供的专门队列类:
$queue = new SplQueue();
$queue->enqueue('item1'); // 入队
$item = $queue->dequeue(); // 出队
数据库实现 创建任务表存储队列项:

CREATE TABLE queue (
id INT AUTO_INCREMENT PRIMARY KEY,
task_data TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status TINYINT DEFAULT 0
);
PHP处理脚本:
// 入队
$db->query("INSERT INTO queue (task_data) VALUES ('task payload')");
// 出队
$db->beginTransaction();
$item = $db->query("SELECT * FROM queue WHERE status = 0 ORDER BY id LIMIT 1 FOR UPDATE");
$db->query("UPDATE queue SET status = 1 WHERE id = {$item['id']}");
$db->commit();
Redis实现 利用Redis的List数据结构:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->rPush('queue', 'item1'); // 入队
$item = $redis->lPop('queue'); // 出队
专业队列系统 使用RabbitMQ需要安装php-amqplib库:
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
// 入队
$msg = new AMQPMessage('task data');
$channel->basic_publish($msg, '', 'task_queue');
// 出队
$callback = function ($msg) {
echo "Received ", $msg->body, "\n";
$msg->ack();
};
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
队列工作进程实现
持久化队列通常需要配合工作进程:
// worker.php
while (true) {
$task = getTaskFromQueue(); // 从队列获取任务
if ($task) {
processTask($task);
} else {
sleep(1); // 队列空时暂停
}
}
可通过Supervisor保持进程运行:
[program:queue_worker]
command=php /path/to/worker.php
autostart=true
autorestart=true
user=www-data
numprocs=4
队列使用注意事项
- 数据库队列需处理并发和锁问题
- Redis队列需考虑持久化配置
- 专业队列系统需要额外服务部署
- 工作进程应实现异常处理和日志记录
- 大规模系统建议使用Redis或RabbitMQ
不同方案适用于不同场景,数组和SplQueue适合内存队列,数据库适合简单持久化队列,Redis和RabbitMQ适合高性能分布式系统。






