要稳定支撑10000并发,必须用Swoole/Workerman替代PHP-FPM,配合OPcache预热、Redis缓存防穿透、数据库连接池及Nginx静态资源分离,形成全链路常驻进程优化体系。

ThinkPHP6 要稳定支撑 10000 并发请求,光靠默认配置和 PHP-FPM 模式根本做不到。响应慢不是框架本身“不行”,而是它默认按“一次请求、一次销毁”设计,而万级并发必须转向常驻内存、连接复用、缓存预热、异步解耦的整套机制。核心在于打破传统 Web 生命周期,而不是零敲碎打调某个参数。
换掉 PHP-FPM,用 Swoole 或 Workerman 接管服务
TP6 原生不支持协程和长连接,但官方扩展 think-swoole 或 think-worker 已封装好生命周期隔离,能安全复用 App 实例、中间件和数据库连接池。直接在 index.php 里 new SwooleHttpServer 会出问题——静态变量污染、Session 错乱、MySQL gone away 都是典型症状。
推荐做法:
- 安装扩展:
composer require topthink/think-swoole - 启动命令:
php think swoole(自动加载配置) - 关键配置(
config/swoole.php):
'server' => [
'host' => '0.0.0.0',
'port' => 9501,
'type' => SWOOLE_HTTP,
'options' => [
'worker_num' => 4,
'task_worker_num' => 4,
'reload_async' => true,
'max_request' => 3000,
'dispatch_mode' => 2,
],
],
'database' => [
'mysql' => [
'pool_size' => 100, // 连接池大小,非最大连接数
'pool_get_timeout' => 5,
],
],
'cache' => [
'enable' => false, // 禁用 file 缓存,避免文件锁争用
],
OPcache 必须开启 + 预热核心字节码
TP6 的 public/index.php 每次动态 require 框架类库,导致 OPcache 只缓存了入口文件,类库文件反复编译。即使开了 OPcache,命中率也极低。
解决方法:
- 确认 php.ini 中已启用:
zend_extension=opcache.so<br>opcache.enable=1<br>opcache.memory_consumption=256<br>opcache.max_accelerated_files=20000<br>opcache.revalidate_freq=60<br>opcache.preload=/path/to/preload.php
- 创建预热脚本
preload.php(示例):
<?php // 加载核心类,触发编译并进 OPcache opcache_compile_file(BASE_PATH . '/vendor/topthink/framework/src/Container.php'); opcache_compile_file(BASE_PATH . '/vendor/topthink/framework/src/App.php'); opcache_compile_file(BASE_PATH . '/vendor/topthink/framework/src/Route.php'); opcache_compile_file(BASE_PATH . '/app/Http/Middleware.php'); // 可补充常用模型、服务类路径 ?>
重启 PHP 后生效,用 opcache_get_status() 查看命中率是否达 95%+。
数据库与缓存必须分层、异步、防穿透
万级并发下,数据库是第一瓶颈点。不能只靠索引优化,要构建“Redis 热点缓存 + 连接池 + 异步写回 + 分布式锁”组合策略。
示例:带防穿透的用户数据读取
// 控制器中
use think\Cache;
use think\facade\Db;
<p>$uid = input('uid');
$key = 'user:detail:' . $uid;</p><p>$data = Cache::store('redis')->get($key);
if (false === $data) {
// 加分布式锁(避免缓存击穿时大量请求打到 DB)
$lockKey = 'lock:user:detail:' . $uid;
if (Cache::store('redis')->handler()->set($lockKey, 1, ['nx', 'ex' => 5])) {
try {
$data = Db::name('user')->where('id', $uid)->find();
if ($data) {
Cache::store('redis')->set($key, $data, 3600);
}
} finally {
Cache::store('redis')->handler()->del($lockKey);
}
} else {
// 等待 100ms 后重试,避免忙等
usleep(100000);
return $this->fetch('loading'); // 或返回兜底数据
}
}
return json($data);</p>
静态资源分离 + Nginx 卸载压力
所有 JS/CSS/图片/字体不要经由 TP6 路由处理。Nginx 直接 serve,同时启用 gzip、brotli、HTTP/2 和连接复用。
Nginx 关键配置片段:
upstream tp_backend {
server 127.0.0.1:9501 max_fails=3 fail_timeout=30s;
keepalive 32;
}
<p>server {
listen 80;
server_name api.example.com;</p><pre class="brush:php;toolbar:false;"># 静态资源直出
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
root /www/wwwroot/api.example.com/public;
expires 1y;
add_header Cache-Control "public, immutable";
}
# API 请求转发给 Swoole
location / {
proxy_pass http://tp_backend;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}}
这套组合拳落地后,实测 QPS 从 100+ 稳定提升至 8000–10000,平均响应时间压到 20–50ms。重点不在单点优化,而在让每个环节都适配常驻进程模型——Swoole 是引擎,OPcache 是燃料,Redis 是缓冲带,Nginx 是分流阀。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











