在 Ubuntu 上优化 PHP-FPM 以提升 PHP 代码的执行效率,可以从多个方面入手,包括调整 PHP-FPM 配置、优化 PHP 代码本身、使用 OpCode 缓存以及监控和调优系统资源等。以下是详细的步骤和建议:
确保你使用的是最新稳定版的 PHP,因为新版本通常包含性能改进和安全修复。例如,截至 2023 年 10 月,PHP 8.1 或 PHP 8.2 是较新的稳定版本。
sudo apt update
sudo apt install php8.2-fpm
OpCode 缓存可以显著提升 PHP 脚本的执行速度,因为它缓存了编译后的字节码,减少了每次请求时的编译开销。常用的 OpCode 缓存有 OPcache 和 APCu。
OPcache 已经集成在 PHP 7.2 及以上版本中,可以通过以下命令启用:
sudo apt install php8.2-opcache
然后,编辑 PHP 配置文件以启用和优化 OPcache。通常,PHP-FPM 的配置文件位于 /etc/php/8.2/fpm/php.ini。
sudo nano /etc/php/8.2/fpm/php.ini
在 php.ini 中添加或修改以下配置:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
参数说明:
opcache.memory_consumption: 分配给 OPcache 的内存大小,根据服务器内存调整。opcache.interned_strings_buffer: 用于存储 interned 字符串的内存大小。opcache.max_accelerated_files: 缓存的最大文件数。opcache.revalidate_freq: 检查脚本更新频率(秒)。opcache.fast_shutdown: 启用快速关闭以减少关闭时的延迟。sudo systemctl restart php8.2-fpm
优化 PHP-FPM 的配置可以提升处理请求的能力和响应速度。
编辑 PHP-FPM 配置文件:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
主要调整以下参数:
pm: 进程管理方式,推荐使用 dynamic 或 ondemand。
pm = dynamic
pm.max_children: 最大子进程数,根据服务器的内存和应用的资源需求设置。
pm.max_children = 50
pm.start_servers: 启动时的服务器进程数。
pm.start_servers = 5
pm.min_spare_servers: 最小空闲服务器进程数。
pm.min_spare_servers = 2
pm.max_spare_servers: 最大空闲服务器进程数。
pm.max_spare_servers = 35
pm.max_requests: 每个子进程在重启前处理的请求数,防止内存泄漏。
pm.max_requests = 500
示例配置:
[www]
listen = /run/php/php8.2-fpm.sock
listen.owner = www-data
listen.group = www-data
user = www-data
group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 35
pm.max_requests = 500
调整完毕后,重启 PHP-FPM:
sudo systemctl restart php8.2-fpm
除了配置层面的优化,优化 PHP 代码本身也是提升性能的关键。
选择合适的数据结构和算法可以显著提升代码执行效率。例如,使用数组而不是对象进行简单的数据存储和访问,避免不必要的循环和递归。
优化数据库查询,使用索引,避免 N+1 查询问题。可以使用工具如 Xdebug 进行性能分析,找出瓶颈。
启用错误日志有助于及时发现和修复问题。同时,使用性能监控工具(如 New Relic、Blackfire)监控应用性能,找出优化点。
PHP 内置函数通常比自定义函数更高效。利用 PHP 的新特性(如箭头函数、命名参数)提升代码简洁性和性能。
缓存重复计算的结果,减少文件和网络 I/O 操作,使用懒加载等技术优化资源使用。
对于数据库连接,使用持久连接可以减少连接建立的开销。在 PHP 中,可以通过配置 PDO 或 MySQLi 使用持久连接。
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$options = [
PDO::ATTR_PERSISTENT => true,
];
$pdo = new PDO($dsn, $user, $password, $options);
启用 Gzip 压缩可以减少传输数据的大小,加快页面加载速度。
在 Nginx 或 Apache 中配置压缩:
Nginx 示例:
server {
# 其他配置...
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 其他配置...
}
Apache 示例:
确保启用了 mod_deflate,并在配置文件中添加:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml
AddOutputFilterByType DEFLATE image/svg+xml image/x-icon font/opentype application/vnd.ms-fontobject application/x-font-ttf font/opentype
</IfModule>
根据应用需求,进一步调整 OPcache 的配置参数。例如:
opcache.validate_timestamps: 控制脚本是否检查文件的修改时间,默认为开启。对于生产环境,可以关闭以提升性能。
opcache.validate_timestamps=0
opcache.huge_code_pages: 在支持大页内存的系统上启用,可以减少 TLB(Translation Lookaside Buffer)未命中,提高性能。
opcache.huge_code_pages=1
注意: 修改
huge_code_pages需要重启 PHP-FPM 并确保系统支持大页内存。
使用系统监控工具(如 top、htop、free -m)监控服务器的 CPU、内存、磁盘 I/O 等资源使用情况。根据监控结果,进一步调整 PHP-FPM 的配置和优化代码。
例如,如果发现内存不足,可以增加 pm.max_children 或优化代码减少内存消耗;如果 CPU 使用率较高,可以考虑使用 PHP 的异步特性或将部分计算任务转移到后台处理。
根据应用需求,安装并配置相关的 PHP 扩展以提升性能。例如:
保持 PHP、PHP-FPM 及相关扩展的更新,及时应用安全补丁和性能改进。定期清理不必要的缓存和日志文件,保持系统的整洁和高效。
通过以上步骤,你可以显著提升在 Ubuntu 上运行的 PHP-FPM 的性能,从而优化 PHP 代码的执行效率。根据具体的应用场景和需求,可能需要针对性地进行调整和优化。