一、协程与传统同步IO对比
同步阻塞模式
- 每个请求独占进程
- IO操作时线程阻塞
- 上下文切换开销大
- 典型并发量:1000-2000
协程模式
- 单线程处理多请求
- IO操作自动挂起
- 纳秒级上下文切换
- 典型并发量:10万+
二、任务调度系统核心实现
1. 协程任务管理器
class TaskScheduler {
private $scheduler;
private $maxWorkers = 100;
private $taskQueue = [];
public function __construct() {
$this->scheduler = new SwooleCoroutineScheduler;
}
public function addTask(callable $task, $params = []) {
$this->taskQueue[] = ['task' => $task, 'params' => $params];
}
public function run() {
$channels = [];
for ($i = 0; $i maxWorkers; $i++) {
$channels[$i] = new SwooleCoroutineChannel(1);
}
$this->scheduler->parallel($this->maxWorkers, function() use ($channels) {
$workerId = SwooleCoroutine::getCid() % $this->maxWorkers;
while (true) {
$taskData = $channels[$workerId]->pop();
if ($taskData === false) break;
try {
call_user_func_array($taskData['task'], $taskData['params']);
} catch (Throwable $e) {
$this->logError($e);
}
}
});
// 分发任务到Worker
foreach ($this->taskQueue as $taskItem) {
$workerId = rand(0, $this->maxWorkers - 1);
$channels[$workerId]->push($taskItem);
}
// 关闭通道
foreach ($channels as $ch) {
$ch->close();
}
$this->scheduler->start();
}
}
2. 分布式任务队列集成
class RedisTaskQueue {
private $redis;
private $queueName = 'coroutine_tasks';
public function __construct() {
$this->redis = new SwooleCoroutineRedis();
$this->redis->connect('127.0.0.1', 6379);
}
public function pushTask($taskType, $data) {
$task = json_encode([
'type' => $taskType,
'data' => $data,
'created_at' => time()
]);
return $this->redis->lPush($this->queueName, $task);
}
public function popTask() {
$task = $this->redis->brPop([$this->queueName], 2);
return $task ? json_decode($task[1], true) : null;
}
}
3. 协程HTTP客户端
class AsyncHttpClient {
public static function request($urls) {
$results = [];
$scheduler = new SwooleCoroutineScheduler;
$scheduler->add(function() use ($urls, &$results) {
$tasks = [];
foreach ($urls as $url) {
$tasks[] = go(function() use ($url, &$results) {
$client = new SwooleCoroutineHttpClient(
parse_url($url, PHP_URL_HOST),
parse_url($url, PHP_URL_PORT),
parse_url($url, PHP_URL_PATH) === 'https'
);
$client->get(parse_url($url, PHP_URL_PATH));
$results[$url] = $client->body;
$client->close();
});
}
SwooleCoroutineBarrier::wait($tasks);
});
$scheduler->start();
return $results;
}
}
三、性能优化关键点
- 连接池管理:复用MySQL/Redis连接
- 协程数量控制:根据负载动态调整
- 内存优化:及时释放大对象
- 异常处理:避免单个任务崩溃影响全局
监控指标示例
$server->stats(); // 获取Swoole运行时状态
/*
[
'coroutine_num' => 当前协程数量,
'task_queue_num' => 待处理任务数,
'request_count' => 累计请求数,
'worker_request_count' => 当前Worker进程处理的请求数
]
*/
四、生产环境部署方案
- 使用Supervisor管理进程
- Nginx反向代理负载均衡
- APM工具监控性能指标
- 灰度发布验证稳定性