1.?消息隊列
使用消息隊列(如RabbitMQ、Beanstalkd、Redis)將任務放入隊列,由后臺進程異步處理。
優點:
-
任務持久化,系統崩潰后任務不丟失。
-
支持分布式處理,擴展性強。
實現步驟:
-
安裝消息隊列服務(如RabbitMQ)。
-
使用PHP客戶端庫(如
php-amqplib
)將任務放入隊列。 -
編寫后臺腳本處理隊列任務。
示例:
// 生產者
$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密集型任務。
-
任務處理速度快。
缺點:
-
配置復雜,調試困難。
-
共享資源需謹慎處理。
示例:
$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密集型任務。
示例:
$loop = React\EventLoop\Factory::create();$loop->addTimer(1, function () {echo "Async task done!\n";
});$loop->run();
4.?Gearman
使用Gearman分布式任務調度系統,適合分布式環境。
優點:
-
分布式處理,擴展性強。
-
支持多種編程語言。
缺點:
-
需額外安裝Gearman服務。
-
配置復雜。
示例:
$client = new GearmanClient();
$client->addServer();$client->doBackground('reverse', 'Hello World!', function ($task) {echo "Task done!\n";
});
5.?Cron Job
使用Cron定時任務處理后臺任務,適合定時任務。
優點:
-
簡單易用。
-
適合定時任務。
缺點:
-
實時性差。
-
不適合高頻率任務。
示例:
# 每分鐘執行一次PHP腳本
* * * * * /usr/bin/php /path/to/your/script.php
總結
-
消息隊列:適合大多數場景,推薦使用。
-
多進程/多線程:適合CPU密集型任務,但復雜度高。
-
ReactPHP:適合I/O密集型任務,高并發場景。
-
Gearman:適合分布式環境。
-
Cron Job:適合定時任務。
根據具體需求選擇合適的方式。