1. 消息队列
使用消息队列(如RabbitMQ、Beanstalkd、Redis)将任务放入队列,由后台进程异步处理。
优点:
-
任务持久化,系统崩溃后任务不丢失。
-
支持分布式处理,扩展性强。
实现步骤:
-
安装消息队列服务(如RabbitMQ)。
-
使用PHP客户端库(如
php-amqplib
)将任务放入队列。 -
编写后台脚本处理队列任务。
示例:
php
// 生产者
$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();
// 消费者
$callback = function ($msg) {
echo "Received: ", $msg->body, "\n";
// 处理任务
$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};
$channel->basic_consume('task_queue', '', false, false, false, false, $callback);
while (count($channel->callbacks)) {
$channel->wait();
}
2. 多进程/多线程
使用pcntl
扩展创建多进程,或pthreads
扩展创建多线程。
优点:
-
适合CPU密集型任务。
-
任务处理速度快。
缺点:
-
配置复杂,调试困难。
-
共享资源需谨慎处理。
示例:
bash
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程
pcntl_wait($status); // 等待子进程结束
} else {
// 子进程
// 执行异步任务
exit();
}
3. ReactPHP
使用ReactPHP库进行事件驱动编程,适合I/O密集型任务。
优点:
-
非阻塞I/O,适合高并发。
-
单进程处理多个任务,资源占用少。
缺点:
-
代码复杂度高。
-
不适合CPU密集型任务。
示例:
php
$loop = React\EventLoop\Factory::create();
$loop->addTimer(1, function () {
echo "Async task done!\n";
});
$loop->run();
4. Gearman
使用Gearman分布式任务调度系统,适合分布式环境。
优点:
-
分布式处理,扩展性强。
-
支持多种编程语言。
缺点:
-
需额外安装Gearman服务。
-
配置复杂。
示例:
php
$client = new GearmanClient();
$client->addServer();
$client->doBackground('reverse', 'Hello World!', function ($task) {
echo "Task done!\n";
});
5. Cron Job
使用Cron定时任务处理后台任务,适合定时任务。
优点:
-
简单易用。
-
适合定时任务。
缺点:
-
实时性差。
-
不适合高频率任务。
示例:
bash
# 每分钟执行一次PHP脚本
* * * * * /usr/bin/php /path/to/your/script.php
总结
-
消息队列:适合大多数场景,推荐使用。
-
多进程/多线程:适合CPU密集型任务,但复杂度高。
-
ReactPHP:适合I/O密集型任务,高并发场景。
-
Gearman:适合分布式环境。
-
Cron Job:适合定时任务。
根据具体需求选择合适的方式。