首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 配置修改範圍詳解:PHP_INI_SYSTEM vs PHP_INI_ALL vs PHP_INI_PERDIR

     編輯:PHP 相關知識

前言

PHP 配置指令的修改範圍決定了在哪裡、如何修改生效。理解 PHP_INI_SYSTEM、PHP_INI_ALL、PHP_INI_PERDIR、PHP_INI_USER 四種模式,避免「改了配置不生效」的低級錯誤。

四大修改範圍對比表

範圍常量可修改位置ini_set()典型指令示例生效時機
PHP_INI_SYSTEMphp.ini、httpd.conf❌ 不可memory_limit、max_execution_time、upload_max_filesize、post_max_sizePHP 重啟(CLI 即時、Web 需重啟 PHP-FPM/Apache)
PHP_INI_PERDIRphp.ini、httpd.conf、.htaccess❌ 不可open_basedir、disable_functions、error_reporting、display_errorsWeb 重啟/Apache 重載
PHP_INI_USERphp.ini、.user.ini、.htaccess✅ 可include_path、max_input_vars、session.save_path即時(.user.ini 需緩存過期)
PHP_INI_ALL所有位置✅ 可date.timezone、default_charset、precision、serialize_precision即時

核心差異深度解析

1. PHP_INI_SYSTEM:系統級,僅 php.ini/httpd.conf

  • 影響進程級資源限制
  • 不可用 ini_set() 修改,代碼中調用無效且不報錯
  • Web 環境修改後必須重啟 PHP-FPM 或 Apache
  • CLI 模式下修改 php.ini 即時生效

2. PHP_INI_PERDIR:目錄級,支援 .htaccess

  • Apache 模塊模式下可在 .htaccess 覆蓋
  • Nginx + PHP-FPM 不支援 .htaccess,只能改 php.ini
  • 不可用 ini_set()
  • 典型:open_basedir 限制訪問目錄、disable_functions 禁用危險函數

3. PHP_INI_USER:用戶級,支援 .user.ini

  • PHP 5.3+ 引入 .user.ini,類似 .htaccess 但針對 PHP-FPM
  • Nginx 環境推薦使用 .user.ini 覆蓋配置
  • 可用 ini_set() 修改
  • 緩存機制:user_ini.cache_ttl(默認 300 秒)控制生效延遲

4. PHP_INI_ALL:全範圍,最靈活

  • 任何位置可改,ini_set() 即時生效
  • 適合運行期動態調整:date.timezone、error_reporting 等

實戰場景:為什麼 ini_set 不生效?

場景 1:修改 memory_limit

<?php
// 錯誤:memory_limit 是 PHP_INI_SYSTEM
ini_set('memory_limit', '512M');  // 無效!

// 正確:修改 php.ini
// memory_limit = 512M
// 重啟 PHP-FPM
?>

場景 2:修改 upload_max_filesize

<?php
// 錯誤:PHP_INI_SYSTEM
ini_set('upload_max_filesize', '100M');  // 無效!

// 正確:php.ini 修改雙項
// upload_max_filesize = 100M
// post_max_size = 120M  // 必須大於 upload_max_filesize
?>

場景 3:Nginx 環境修改 open_basedir

# 錯誤:Nginx 不支援 .htaccess
# .htaccess 中 php_value open_basedir "/var/www/:/tmp/"

# 正確:修改 php.ini 或 .user.ini
# php.ini: open_basedir = "/var/www/:/tmp/"

# 或項目目錄建立 .user.ini
# open_basedir = "/var/www/:/tmp/"
# 等待 300 秒生效(或重啟 PHP-FPM 即時)

查詢指令修改範圍的三種方法

1. PHP 手冊官方列表

https://www.php.net/manual/zh/ini.list.php

2. 命令行查詢

php -i | grep memory_limit
# 輸出包含:memory_limit => 128M => 128M
# 格式:指令 => 本地值 => 主值

3. 代碼運行時查詢

<?php
echo ini_get('memory_limit');  // 128M
echo ini_get_all()['memory_limit']['access'];  // 7 (PHP_INI_SYSTEM=4 | PHP_INI_PERDIR=2 | PHP_INI_USER=1)
// access 值對應:4=SYSTEM, 2=PERDIR, 1=USER, 7=ALL
?>

最佳實踐建議

  1. 開發環境:php.ini 統一管理,版本控制納管
  2. 生產環境:PHP_INI_SYSTEM 指令走配置管理(Ansible/Dockerfile),PHP_INI_USER 指令用 .user.ini 實現項目級隔離
  3. 代碼中:僅使用 ini_set() 修改 PHP_INI_ALL/USER 指令,並加註釋說明範圍
  4. 排查不生效:先查指令範圍 → 確認修改位置正確 → 確認重啟/緩存過期 → 檢查是否被後載入配置覆蓋

掌握修改範圍機制,配置管理不再踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved