在 Ubuntu 上优化 PHP-FPM 以改善数据库连接性能,可以从多个方面入手。以下是一些关键步骤和建议:
PHP-FPM 的配置文件通常位于 /etc/php/{版本}/fpm/pool.d/www.conf
。根据服务器的内存和预期的并发连接数,调整以下参数:
pm
(进程管理方式):
dynamic
:根据负载动态调整子进程数量。ondemand
:按需启动子进程,适用于低流量网站。dynamic
,并设置合理的 pm.max_children
、pm.start_servers
、pm.min_spare_servers
和 pm.max_spare_servers
。pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
request_terminate_timeout
:
设置请求超时时间,防止长时间运行的脚本占用资源。
request_terminate_timeout = 30s
使用持久连接(persistent connections)可以减少每次请求时建立和关闭数据库连接的开销。在 PHP 中,可以通过设置 PDO
或 mysqli
的持久连接选项来实现。
PDO 示例:
$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8mb4';
$options = [
PDO::ATTR_PERSISTENT => true,
];
try {
$pdo = new PDO($dsn, $user, $password, $options);
} catch (PDOException $e) {
// 处理异常
}
mysqli 示例:
$mysqli = new mysqli('p:localhost', 'user', 'password', 'your_database');
if ($mysqli->connect_error) {
// 处理连接错误
}
注意:持久连接在某些情况下可能会导致连接泄漏,尤其是在高并发环境下。确保应用程序正确管理数据库连接。
根据应用需求,适当增加 PHP 的内存限制和最大执行时间,以避免因资源不足导致的性能问题。
memory_limit = 256M
max_execution_time = 60
OPcache 可以显著提高 PHP 脚本的执行速度,通过缓存编译后的字节码减少重复编译的开销。
[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
PHP 7 及以上版本在性能上有显著提升,建议升级到最新的稳定版本以获得更好的性能和安全性。
innodb_buffer_pool_size
、max_connections
等。对于高并发应用,可以考虑使用专门的连接池管理工具,如 PHP-PM 或第三方库,来更高效地管理数据库连接。
定期监控 PHP-FPM 和数据库的性能指标,使用工具如 htop
、php-fpm status
、MySQL Workbench
等,分析日志以发现潜在的瓶颈和优化点。
在高流量环境下,考虑使用负载均衡器(如 Nginx 或 HAProxy)分发请求,并部署多个 PHP-FPM 实例以提高可用性和性能。
确保 PHP-FPM 运行的用户具有访问数据库的最小必要权限,避免因权限过大导致的安全风险。
www.conf
配置; Start a new pool named 'www'.
[www]
; per request buffering
php_admin_value[buffer_size] = 4096K
; the path to the PHP binary
php_admin_value[executable] = /usr/bin/php-fpm7.4
; the path to the FastCGI process manager (FPM) binary
php_admin_value[fpm_bin] = /usr/bin/php-fpm7.4
; the path to the PHP application in fastcgi mode
php_admin_value[app_path] = /var/www/html
; the directory in which the FastCGI process manager runs
php_admin_value[process_control_timeout] = 0
; the directory where the temporary files should be placed
php_admin_value[bin_environ] = noninteractive
; the start server
php_admin_value[start_servers] = 5
; the minimum number of servers to keep in the pool
php_admin_value[min_spare_servers] = 5
; the maximum number of servers to keep in the pool
php_admin_value[max_spare_servers] = 35
; the maximum number of requests each child may process before being recycled
php_admin_value[max_requests_per_child] = 5000
; the process lifetime
php_admin_value[pm_max_children] = 50
; the request timeout
request_terminate_timeout = 30s
; enable persistent connections
php_admin_flag[persistent_connections] = on
; persistent connection lifetime
php_admin_value[persistent_keep_alive] = 60
; clear environment on restart
php_admin_flag[clear_env] = no
; log level
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
; log level for slow requests
php_admin_value[slowlog] = /var/log/php-fpm/www-slow.log
; catch workers output
php_admin_flag[catch_workers_output] = yes
; environment variables
php_admin_value[env[MYSQL_HOST]] = localhost
php_admin_value[env[MYSQL_DB]] = your_database
php_admin_value[env[MYSQL_USER]] = user
php_admin_value[env[MYSQL_PASSWORD]] = password
通过合理配置 PHP-FPM、优化数据库连接方式、调整 PHP 和数据库的参数,以及监控和分析性能指标,可以显著提升在 Ubuntu 上运行的 PHP 应用与数据库的连接性能。根据具体的应用场景和服务器资源,灵活调整上述建议以达到最佳效果。