CentOS上PHP配置优化指南
优化前需确保系统和软件包为最新版本,避免已知bug影响性能。使用EPEL和Remi存储库安装最新稳定版PHP(如7.4/8.x)及常用扩展,提升兼容性与性能:
sudo yum update -y
sudo yum install epel-release -y
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
sudo yum-config-manager --enable remi-php74 # 根据需求选择PHP版本
sudo yum install php php-cli php-fpm php-mysqlnd php-gd php-mbstring php-xml php-zip -y
PHP-FPM(FastCGI进程管理器)能有效提升PHP处理高并发的能力,需调整以下核心参数(配置文件路径:/etc/php-fpm.d/www.conf):
dynamic(动态调整进程数,平衡性能与资源占用),若服务器长期负载稳定可选择ondemand(按需创建进程,节省内存)。pm.max_children:最大子进程数,需根据服务器内存计算(公式:(可用内存 - 1G) / 单个PHP进程内存(约30-50M),例如2G内存服务器可设为50)。pm.start_servers:启动时的子进程数,建议设为max_children的1/4~1/2(如pm.max_children=50则设为10-25)。pm.min_spare_servers/pm.max_spare_servers:空闲进程的最小/最大数量,避免频繁创建/销毁进程(如均设为max_children的1/4,即10-25)。request_terminate_timeout设置单个请求的超时时间(如30秒),防止长时间运行的脚本占用资源。sudo systemctl restart php-fpm
编辑/etc/php.ini文件,优化以下关键参数以提升性能与稳定性:
memory_limit设置为256M(根据应用需求调整,如WordPress等常规应用256M足够,大型应用可设为512M)。max_execution_time设置为300秒(默认30秒,适用于需要长时间处理的脚本,如数据导入/导出)。upload_max_filesize和post_max_size设置为50M(根据业务需求调整,如允许用户上传大文件)。display_errors设为Off(生产环境隐藏错误信息,避免泄露敏感信息),log_errors设为On(记录错误到/var/log/php_errors.log,便于排查问题)。date.timezone设置为Asia/Shanghai(或其他所需时区),避免时间相关函数报错。OPcache缓存PHP脚本编译后的字节码,显著减少脚本加载时间(尤其对频繁访问的页面效果明显)。编辑/etc/php.ini文件,添加或修改以下参数:
[opcache]
zend_extension=opcache.so # 启用OPcache扩展
opcache.enable=1 # 开启OPcache
opcache.enable_cli=0 # CLI模式下关闭(避免不必要的缓存)
opcache.memory_consumption=128 # OPcache缓存内存大小(MB,根据服务器内存调整,如128M)
opcache.interned_strings_buffer=8 # 内部字符串缓冲区大小(MB,默认8M足够)
opcache.max_accelerated_files=4000 # 缓存的最大脚本文件数(根据应用文件数量调整,如4000)
opcache.revalidate_freq=60 # 脚本更新检查频率(秒,默认60秒,生产环境可设为0强制每次检查)
opcache.fast_shutdown=1 # 快速关闭,提升脚本结束时的内存回收效率
修改后重启PHP-FPM使配置生效。
数据库操作是PHP应用的常见性能瓶颈,需通过以下方式优化:
PDO::ATTR_PERSISTENT => true)。SELECT *(只查询所需字段),合理使用索引(如为WHERE、JOIN条件添加索引),合并多次查询为单条JOIN语句。使用Redis或Memcached缓存频繁访问的数据(如热点数据、查询结果),降低数据库压力:
sudo yum install redis -y # Redis
sudo systemctl start redis && sudo systemctl enable redis
# 或
sudo yum install memcached -y # Memcached
sudo systemctl start memcached && sudo systemctl enable memcached
sudo yum install php-pecl-redis -y # Redis扩展
sudo yum install php-pecl-memcached -y # Memcached扩展
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'hot_data';
if ($redis->exists($key)) {
$data = $redis->get($key); // 从缓存读取
} else {
$data = $pdo->query("SELECT * FROM hot_table")->fetchAll(PDO::FETCH_ASSOC); // 从数据库读取
$redis->set($key, $data, 3600); // 缓存1小时
}
unset()释放不再需要的变量(如大数组、数据库连接),帮助PHP垃圾回收机制回收内存。yield)以迭代方式处理数据,避免一次性加载大量数据到内存(如处理百万级数据的循环)。count($array)放在循环外),减少循环嵌套层数。使用工具监控PHP性能,识别瓶颈并进行针对性调整:
top、htop、vmstat监控服务器CPU、内存、磁盘IO使用情况,判断是否因资源不足导致PHP性能下降。xdebug扩展生成性能分析报告(如函数调用时间、内存消耗),识别慢函数或内存泄漏点。sudo systemctl restart php-fpm、sudo systemctl restart nginx/apache)使生效。