php如何实现队列
使用 PHP 原生数组实现队列
PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进先出特性。array_push 用于入队,array_shift 用于出队。
$queue = [];
// 入队
array_push($queue, 'item1');
array_push($queue, 'item2');
// 出队
$item = array_shift($queue);
echo $item; // 输出 'item1'
使用 SPL 库中的 SplQueue 类
PHP 标准库 (SPL) 提供了 SplQueue 类,专门用于队列操作。它比数组更高效且提供更多队列相关方法。
$queue = new SplQueue();
// 入队
$queue->enqueue('item1');
$queue->enqueue('item2');
// 出队
$item = $queue->dequeue();
echo $item; // 输出 'item1'
使用 Redis 实现持久化队列
对于需要持久化或分布式处理的场景,Redis 的列表结构非常适合实现队列。PHP 通过 predis 或 redis 扩展与 Redis 交互。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 入队
$redis->rpush('my_queue', 'item1');
$redis->rpush('my_queue', 'item2');
// 出队
$item = $redis->lpop('my_queue');
echo $item; // 输出 'item1'
使用消息队列系统(如 RabbitMQ)
对于大型系统,专业的消息队列系统如 RabbitMQ 更可靠。PHP 通过 php-amqplib 库与 RabbitMQ 交互。
安装库:
composer require php-amqplib/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('Hello World!');
$channel->basic_publish($msg, '', 'task_queue');
$channel->close();
$connection->close();
消费者代码:

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$callback = function ($msg) {
echo 'Received: ', $msg->body, "\n";
};
$channel->basic_consume('task_queue', '', false, true, false, false, $callback);
while ($channel->is_consuming()) {
$channel->wait();
}
使用数据库实现队列
对于简单的持久化需求,可以用数据库表模拟队列。创建包含 id, data, status, created_at 字段的表。
入队:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare("INSERT INTO queue (data, status) VALUES (?, 'pending')");
$stmt->execute(['item1']);
出队:
$pdo->beginTransaction();
$stmt = $pdo->query("SELECT * FROM queue WHERE status = 'pending' ORDER BY id ASC LIMIT 1 FOR UPDATE");
$item = $stmt->fetch();
if ($item) {
$update = $pdo->prepare("UPDATE queue SET status = 'processing' WHERE id = ?");
$update->execute([$item['id']]);
$pdo->commit();
echo $item['data'];
}
使用 Laravel 的队列系统
Laravel 提供了开箱即用的队列系统,支持数据库、Redis、Amazon SQS 等多种驱动。

创建任务:
php artisan make:job ProcessPodcast
任务类:
namespace App\Jobs;
class ProcessPodcast implements ShouldQueue
{
public function handle()
{
// 处理任务逻辑
}
}
分发任务:
ProcessPodcast::dispatch();
启动队列处理器:
php artisan queue:work






