php_admin_value 在 PHP-FPM 进程池配置文件中定义,优先级高于全局 php.ini,仅对当前进程池生效,修改后必须重载 PHP-FPM 服务才能生效。
先说结论:php_admin_value 是 PHP-FPM 池级别的强制配置,会覆盖 php.ini 中的全局设置,且不允许 PHP 脚本运行时修改。
- 适合:需要针对特定站点禁用危险函数或调整内存限制的场景
- 先准备:确认 php-fpm 池配置文件路径及指令的可用性
- 验收:通过 phpinfo 页面检查 Local Value 是否已变更
命令速用版
在 PHP-FPM 池配置文件中添加配置项,然后重载服务。
# 编辑池配置,例如 /etc/php/8.1/fpm/pool.d/www.conf
php_admin_value[disable_functions] = exec,passthru
php_admin_value[memory_limit] = 256M
# 重载 PHP-FPM
systemctl reload php8.1-fpm
为什么会这样
PHP 配置加载遵循层级优先级,PHP-FPM 池配置优于全局 php.ini。
PHP 启动时先读取 php.ini 作为全局默认值(Master Value),随后 PHP-FPM 主进程启动工作池时,会读取池配置文件中的 php_admin_value 并应用于该池的所有工作进程(Local Value)。由于标记为 admin 级别,这些设置被视为管理员强制策略,PHP 脚本中的 ini_set 函数无法再次修改它们。
分步处理
按顺序修改配置、检查语法并重载服务,避免配置错误导致服务启动失败。
1. 找到池配置文件,通常位于 /etc/php/*/fpm/pool.d/ 目录下,默认名为 www.conf。
2. 使用正确的语法添加配置,格式为 php_admin_value[指令名] = 值。
3. 检查配置语法,部分系统支持 php-fpm -t 命令测试配置。
4. 重载 PHP-FPM 服务,不要使用 restart 以免中断现有请求,优先使用 reload。
怎么验证是否生效
通过 phpinfo 函数页面查看对应指令的 Local Value 是否与配置一致。
创建包含 <?php phpinfo(); ?> 的测试文件,在浏览器访问。查找目标配置项,对比 Master Value 和 Local Value。如果 Local Value 显示为你设置的值,说明覆盖成功。如果 Local Value 与 Master Value 相同,说明配置未生效或路径错误。
常见坑
配置语法错误或指令模式不支持会导致设置无效或服务启动报错。
1. 指令模式限制:部分 php.ini 指令标记为 PHP_INI_SYSTEM,不能在池配置中修改,需查阅官方文档确认指令模式。
2. 语法格式:等号两边不要有多余空格,指令名必须包含在方括号内。
3. 服务重载:修改后不重载服务,配置不会应用到现有工作进程。
4. CLI 环境无效:php_admin_value 仅对 FPM 模式生效,命令行 php -i 看到的仍是 php.ini 配置。
常见问题
php_admin_value 和 php_value 有什么区别?
php_admin_value 设置的值不允许脚本修改,php_value 允许脚本通过 ini_set 覆盖。
修改后需要重启服务器吗?
不需要重启服务器,只需重载 PHP-FPM 服务即可生效。
为什么命令行 php -i 看不到修改?
php_admin_value 仅作用于 PHP-FPM 进程池,命令行 CLI 模式读取的是独立的 php.ini 配置。
参考来源
PHP.net - PHP-FPM Configuration
https://www.php.net/manual/en/install.fpm.configuration.php
PHP.net - Configuration File Modes
https://www.php.net/manual/en/configuration.file.php