调整内核参数以提升系统对高并发的处理能力。关键配置包括:
/etc/security/limits.conf,增加nofile(最大文件描述符数),如* soft nofile 65535; * hard nofile 65535,避免高并发下连接数受限。/etc/sysctl.conf,启用TCP窗口缩放(net.ipv4.tcp_window_scaling=1)、调整TCP缓冲区大小(net.core.rmem_max=16777216; net.core.wmem_max=16777216)、减少SYN等待时间(net.ipv4.tcp_synack_retries=2),提升网络传输效率。vm.swappiness设置为10(默认60),减少系统使用交换分区的频率,优先利用物理内存,降低IO延迟。启用OPcache加速PHP脚本执行,修改php.ini:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=256 ; 缓存大小(MB),根据服务器内存调整
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000 ; 缓存文件数量
opcache.revalidate_freq=60 ; 文件修改检查间隔(秒)
同时,调整PHP-FPM参数(php-fpm.conf)以适应并发需求:
pm = dynamic
pm.max_children = 50 ; 最大子进程数(根据内存计算:内存/单个进程占用)
pm.start_servers = 5 ; 启动时的进程数
pm.min_spare_servers = 5 ; 最小空闲进程数
pm.max_spare_servers = 35 ; 最大空闲进程数
.env文件中设置APP_DEBUG = false,禁用调试信息的输出(如SQL日志、错误堆栈),减少不必要的资源消耗。php think optimize:route命令生成路由缓存文件,避免每次请求都重新注册路由,降低框架开销。config/log.php中的level设置为error,仅记录错误日志,避免大量info日志占用IO资源。with()方法实现关联预加载,避免N+1查询问题(如User::with('posts')->select());禁止在循环中执行数据库查询,尽量使用批量操作(如Db::name('user')->insertAll($data))。'cache' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'select' => 0,
],
通过Cache::remember('key', 3600, function(){ ... })实现热点数据预加载。WHERE、JOIN、ORDER BY)添加索引,使用EXPLAIN分析SQL执行计划,避免全表扫描。slow_query_log=1),通过pt-query-digest等工具分析慢查询,优化复杂SQL(如拆分大查询、避免SELECT *)。WHERE DATE(create_time) = '2025-10-01')、使用OR连接未索引的字段。使用数据库连接池(如Swoole的连接池)减少连接建立和销毁的开销,配置示例(database.php):
'connections' => [
'mysql' => [
'pool_size' => 100, ; 连接池大小
'pool_get_timeout' => 5, ; 获取连接超时时间(秒)
],
],
采用多级缓存架构提升访问速度:
think-cache的本地缓存驱动,缓存小数据(如配置项),减少Redis访问次数。'cache' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
],
cron)预热热点数据(如每小时加载热门商品数据到Redis),避免首次访问时的延迟。将静态资源(图片、CSS、JS、字体)托管到CDN(内容分发网络),利用CDN的边缘节点缓存资源,减少用户访问时的网络延迟和服务器带宽消耗。
将静态资源部署到独立的服务器(如Nginx专用于静态资源),配置Nginx示例:
server {
listen 80;
server_name static.yourdomain.com;
root /path/to/static/files;
location / {
expires 30d; ; 设置缓存过期时间
add_header Cache-Control "public";
}
}
通过url助手函数生成静态资源URL(如url('static/image.jpg')),指向CDN地址。
使用Nginx作为反向代理,配置负载均衡(upstream模块),将请求分发到多台ThinkPHP服务器:
upstream thinkphp_servers {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://thinkphp_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
同时,配置Session共享(如Redis存储Session),避免用户会话丢失:
'session' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'prefix' => 'sess_',
],
使用消息队列(如RabbitMQ、Redis的list结构)处理耗时任务(如发送邮件、生成报表),避免阻塞主线程。配置示例(ThinkPHP Job):
class SendEmailJob extends Job
{
public function fire($job, $data)
{
// 发送邮件逻辑
Mail::send('email.template', $data, function($message) use ($data) {
$message->to($data['email'])->subject('通知');
});
$job->delete(); // 任务完成,删除队列
}
}
// 推送任务到队列
Queue::push(new SendEmailJob(['email' => 'user@example.com']));
top(查看进程CPU/内存占用)、vmstat(查看系统整体状态)、iostat(查看磁盘IO)、netstat/ss(查看网络连接)监控系统资源。New Relic、Datadog监控应用性能(如响应时间、SQL查询时间、缓存命中率),定位瓶颈。ELK(Elasticsearch+Logstash+Kibana)收集和分析应用日志,快速发现异常。使用Apache JMeter或LoadRunner模拟高并发场景(如1000并发用户),测试应用的响应时间、吞吐量(QPS),根据测试结果调整配置(如增加PHP-FPM进程数、优化SQL)。