优化Ubuntu上ThinkPHP性能的实践指南
apt安装常用扩展(如php-mysql、php-xml、php-gd、php-curl),避免缺失扩展导致的额外开销;禁用不需要的扩展(如xdebug生产环境),减少内存占用。PHP-FPM(FastCGI Process Manager)是Ubuntu下处理PHP请求的高效方式,需调整进程池参数以匹配服务器资源:
/etc/php/8.1/fpm/pool.d/www.conf),调整以下关键参数:
pm.max_children:设置最大子进程数(建议值为(服务器内存 - 系统预留内存) / 单个PHP进程内存,如1GB内存可设为50-80);pm.start_servers:启动时的子进程数(建议为pm.max_children的1/4-1/2);pm.min_spare_servers/pm.max_spare_servers:空闲进程的最小/最大数量(建议设为pm.max_children的1/8-1/4),避免频繁创建/销毁进程的开销。sudo systemctl restart php8.1-fpm。OPcache通过缓存编译后的PHP脚本,减少重复解析时间,是提升ThinkPHP性能的核心手段:
opcache扩展已安装(sudo apt install php-opcache);php.ini中启用并配置OPcache:zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 缓存内存大小(MB,根据服务器内存调整)
opcache.interned_strings_buffer=8 # 内部字符串缓存大小
opcache.max_accelerated_files=4000 # 缓存文件数量(建议为项目文件总数的1.5倍)
opcache.revalidate_freq=60 # 文件修改检查频率(秒,生产环境可设为0禁用检查)
数据库是ThinkPHP应用的常见瓶颈,需从以下方面优化:
WHERE、JOIN、ORDER BY涉及的字段)添加索引,避免全表扫描;EXPLAIN分析慢查询,避免SELECT *(只查询所需字段),减少子查询和联合查询的使用;Cache类(如Redis、Memcached)缓存频繁访问的查询结果(如配置信息、分类列表),设置合理的过期时间(如1小时);Swoole或ProxySQL实现数据库连接池,减少连接建立/销毁的开销。合理使用缓存可显著降低服务器负载:
config/app.php):'cache' => [
'type' => 'file',
'path' => runtime_path() . 'cache', // 缓存目录(确保可写)
],
php-redis扩展):'cache' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '', // 若有密码需填写
'select' => 0, // 数据库编号
],
expires 30d),减少客户端重复请求。server {
listen 80;
server_name yourdomain.com;
root /path/to/your/project/public; # ThinkPHP项目public目录
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string; # 路由到index.php
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # PHP-FPM socket路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires 30d;
access_log off;
}
}
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 6; # 压缩级别(1-9,建议6)
server块中添加listen 443 ssl http2;,提升多路复用效率(需配置SSL证书)。unset()及时释放不再需要的变量(如大型数组),避免内存泄漏;spl_autoload_register()实现类的按需加载,减少初始加载时间;yield)处理大型数据集(如大数据导出)。debug模式)分析代码性能,找出慢查询、高内存占用的瓶颈;top、htop、vmstat等工具监控CPU、内存、磁盘IO使用情况,及时调整配置;