Windows PHP8 php.ini参数说明 生产环境配置指南

生活日记 工作心得
14
发表时间: 编辑:顾永胜来源:0513.city标签:PHP配置

engine = On

含义:是否启用 PHP 引擎。

实际意义:设为 Off 就相当于 PHP 完全罢工,这个网站跑不了 PHP。永远保持 On。

short_open_tag = Off

含义:是否允许 这种短标签。

为什么关:如果网站输出 XML, 会被 PHP 误当成 PHP 代码,导致解析错误。只用 最安全。

precision = 14

含义:浮点数显示的有效数字位数。

一般不动,除非你做金融计算需要更高精度。

output_buffering = 4096

含义:输出缓冲,PHP 先把输出攒到 4KB 再一次性发给浏览器。

好处:减少网络传输次数,提升性能。

注意:CLI 模式下强制为 Off。

;output_handler =

含义:自定义输出处理函数,比如自动做 gzip 压缩。

很少用,一般用 Web 服务器(IIS/Apache/Nginx)做压缩更高效。

zlib.output_compression = Off

含义:是否用 zlib 库自动压缩输出。

建议:保持 Off,让 Web 服务器做压缩,PHP 做会增加 CPU 负担。

implicit_flush = Off

含义:每次 echo/print 后自动 flush 到浏览器。

为什么关:严重影响性能,只有调试实时输出(比如进度条)时才开。

unserialize_callback_func =

含义:反序列化时遇到未定义的类,调用这个函数去自动加载。

高阶用法,一般配合 spl_autoload_register 使用。

;unserialize_max_depth = 4096

含义:反序列化嵌套深度限制,防无限递归导致栈溢出。

PHP 8+ 默认已有限制,一般不用改。

serialize_precision = -1

含义:序列化浮点数时的精度。-1 表示自动选最佳精度,确保反序列化后数值不变。保持默认。

open_basedir = "D:\0513;D:\php832;D:\php_upload_tmp;C:\Windows\Temp"

含义:限制 PHP 只能访问指定目录及其子目录。

安全神器:如果设置 open_basedir = "D:\www",PHP 就无法读取 C:\Windows\ 等系统目录。

副作用:会禁用 realpath 缓存,轻微影响性能。

disable_functions =

disable_classes =

含义:禁用某些危险函数/类。

常见用法:disable_functions = exec,system,passthru,shell_exec,proc_open,popen,dl,show_source,highlight_file

安全建议:生产环境建议禁用命令执行类函数。

zend.enable_gc = On

含义:启用循环引用垃圾回收器。

为什么开:PHP 的引用计数无法处理循环引用(A 引用 B,B 引用 A),GC 负责清理这些内存泄漏。

zend.exception_ignore_args = On

zend.exception_string_param_max_len = 0

含义:异常堆栈中不显示函数参数,字符串参数最多显示 0 个字符。

安全目的:防止异常信息里泄露数据库密码、Token 等敏感字符串。

expose_php = Off

含义:是否在 HTTP 响应头里暴露 X-Powered-By: PHP/8.3.2。

安全建议:改为 Off,不让攻击者知道你的 PHP 版本。

max_execution_time = 60

含义:单个 PHP 脚本最长执行时间(秒)。

注意:CLI 模式下强制为 0(无限)。

为什么调低:防止恶意/错误脚本无限运行,拖垮服务器。

max_input_time = 60

含义:PHP 解析 POST/GET/文件上传输入数据的最长时间。

与上面区别:max_execution_time 从脚本开始执行计时,max_input_time 从 PHP 开始接收数据计时。

memory_limit = 256M

含义:单个 PHP 进程最多使用多少内存。

重要:这不是 OPcache 的内存,是单个请求的内存上限。如果脚本内存超限,PHP 会直接报错退出。

;max_input_vars = 1000

含义:POST/GET/COOKIE 最多接受多少个输入变量。

什么时候改:如果表单里有大量复选框(比如一次提交 5000 个 ID),需要调大。

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

含义:报告所有错误,除了废弃警告和严格标准警告。

开发环境:用 E_ALL(什么都报)。

生产环境:当前值,避免日志被废弃函数调用刷屏。

display_errors = Off

display_startup_errors = Off

含义:是否把错误显示在网页上。

生产必须 Off:用户看到错误信息不仅体验差,还可能泄露数据库结构、文件路径。

log_errors = On

含义:把错误记录到日志文件。

生产必须 On:错误不显示,但必须记录下来供排查。

ignore_repeated_errors = Off

ignore_repeated_source = Off

含义:是否忽略重复错误。

建议:保持 Off,日志完整比省空间重要。

report_memleaks = On

含义:报告内存泄漏(仅在 debug 编译的 PHP 中有效)。保持默认。

;html_errors = On

含义:错误信息用 HTML 格式输出(带颜色、链接)。

生产保持注释(Off):日志里不需要 HTML 标签。

;error_log = php_errors.log

含义:错误日志文件路径。

variables_order = "GPCS"

含义:注册哪些超全局变量。G=GET, P=POST, C=COOKIE, S=SERVER, E=ENV。

生产去掉 E:环境变量很少在 Web 中用,省内存。

request_order = "GP"

含义:$_REQUEST 数组包含哪些来源。

默认只含 GET 和 POST,防止 COOKIE 覆盖 POST 数据。

register_argc_argv = Off

含义:是否在 Web 环境下注册 $argc 和 $argv(命令行参数)。

Web 下不需要,关掉省内存。

auto_globals_jit = On

含义:超全局变量($_GET, $_POST 等)延迟创建,用到时才初始化。

性能优化,保持 On。

post_max_size = 110M

含义:整个 POST 请求体(含所有文件和表单字段)的最大大小。

必须大于 upload_max_filesize。

auto_prepend_file =

auto_append_file =

含义:自动在每个 PHP 文件开头/结尾包含指定文件。

用途:比如自动加载公共库、自动插入页脚统计代码。

default_mimetype = "text/html"

default_charset = "UTF-8"

含义:默认 Content-Type 和字符集。

保持 UTF-8,现代网站标准。

;include_path = ".;c:\php\includes"

含义:include/require 找不到文件时,去这些目录找。

类似系统 PATH 环境变量。

doc_root =

user_dir =

含义:doc_root 是 PHP 页面的根目录;user_dir 是 ~/username 风格的用户目录。

一般不用,Web 服务器(IIS/Apache)已经配置好了根目录。

extension_dir = "D:\php832\ext"

含义:PHP 扩展(DLL 文件)存放目录。

Windows 必配,Linux 一般不用改(系统目录)。

enable_dl = Off

含义:是否允许运行时动态加载扩展(dl() 函数)。

安全建议:生产环境必须 Off,防止脚本加载恶意扩展。

;cgi.force_redirect = 1

;cgi.fix_pathinfo=1

;fastcgi.impersonate = 1

含义:CGI/FastCGI 相关安全选项。

IIS 用户注意:cgi.force_redirect 在 IIS 下必须关闭或注释。

file_uploads = On

含义:是否允许 HTTP 文件上传。

关掉就彻底不能上传了。

upload_tmp_dir = "D:\php_upload_tmp"

含义:上传文件的临时存放目录。

注意:这个目录必须存在,且 Web 服务器进程有写入权限。

upload_max_filesize = 100M

含义:单个上传文件的最大大小。

注意:必须小于 post_max_size。

max_file_uploads = 20

含义:单次请求最多上传多少个文件。

防攻击:防止有人一次上传几万个文件拖垮服务器。

allow_url_fopen = On

含义:是否允许 fopen/fread 打开远程 URL(如 http://example.com/file.txt)。

安全风险:如果代码里有 fopen($_GET['url']) 这种写法,可能被 SSRF 攻击利用。

建议:如果不需要,改为 Off。

allow_url_include = Off

含义:是否允许 include/require 远程 URL。

生产必须 Off:这是极危险的功能,攻击者可能让你包含恶意远程代码。

default_socket_timeout = 60

含义:网络流(socket)默认超时时间。

比如:file_get_contents('http://...') 最多等 60 秒。

extension=curl

extension=fileinfo

extension=gd

extension=mbstring

extension=openssl

extension=pdo_mysql

extension=zip

zend_extension=opcache

含义:加载 PHP 扩展模块。

extension= 加载普通扩展(如 curl, gd)

zend_extension= 加载 Zend 扩展(只有 OPcache、Xdebug 等少数几个)

extension=curl 这种写法(不加 php_ 前缀和 .dll 后缀)是 PHP 7.2+ 的推荐写法,跨平台兼容。

cli_server.color = On

含义:PHP 内置的 CLI Web 服务器(php -S localhost:8000)是否用彩色输出。

只有开发时用内置服务器才有效,生产不用管。

date.timezone = Asia/Shanghai

含义:默认时区。

必须设置,否则 date() 等函数会报时区警告。

pdo_mysql.default_socket=

含义:连接本地 MySQL 时用的 Unix Socket 路径。

Windows 下无效,Windows 用 TCP/IP(localhost:3306)

session.save_handler = files

;session.save_path = "/tmp"

含义:Session 数据存哪里。files 表示存文件。

session.use_strict_mode = 1

session.use_cookies = 1

session.use_only_cookies = 1

含义:严格模式拒绝未初始化的 Session ID;只用 Cookie 传 Session ID,不用 URL。

安全:严格模式防 Session Fixation 攻击。

session.name = PHPSESSID

session.cookie_lifetime = 0

session.cookie_path = /

session.cookie_httponly = 1

session.cookie_samesite = "Lax"

含义:Session Cookie 的名字、有效期、路径、安全属性。

HttpOnly:禁止 JS 读取,防 XSS 窃取 Session。

SameSite=Lax:防止 CSRF 跨站请求伪造。

session.gc_probability = 1

session.gc_divisor = 1000

session.gc_maxlifetime = 1440

含义:垃圾回收概率 = 1/1000,Session 1440 秒(24 分钟)未活跃视为过期。

注意:Windows 下文件 Session 的 GC 可能不自动运行,需要手动清理或改用数据库存 Session。

zend.assertions = -1

含义:-1 表示完全不编译 assert 语句,零开销。

生产必须 -1,开发环境用 1。

[COM]

Windows 特有的 COM 组件支持,一般不用,除非你要操作 Excel、Word 等 Office 组件。

[mbstring]

多字节字符串处理(中文、日文等)。

关键:mbstring.internal_encoding 等已废弃,用全局的 default_charset 代替。

[gd]

图像处理库。gd.jpeg_ignore_warning 可以忽略 JPEG 解码警告。

[exif]

读取图片 EXIF 信息(拍摄时间、GPS 等)。

注意:exif 扩展必须在 mbstring 之后加载,因为依赖它。

[Tidy]

HTML 清理和修复。tidy.clean_output = Off 表示不自动清理输出。

SOAP Web Service 支持。

注意:soap.wsdl_cache_dir="/tmp" 在 Windows 下必须改成实际路径,比如 D:\php832\temp

[sysvshm]

System V 共享内存,Windows 不支持,忽略。

[ldap]

LDAP 目录服务连接。ldap.max_links = -1 表示连接数无限制。

[dba]

数据库抽象层(Berkeley DB 等),很少用。

opcache.enable=1

总开关

opcache.enable_cli=0

CLI 模式下不开(命令行脚本生命周期短,不需要缓存)

opcache.memory_consumption=128

共享内存大小(MB),缓存编译后的 opcode

opcache.interned_strings_buffer=8

字符串驻留内存,相同字符串只存一份

opcache.max_accelerated_files=10000

最多缓存多少个 PHP 文件

opcache.max_wasted_percentage=5

浪费内存超过 5% 时触发重启

opcache.use_cwd=1

把当前工作目录拼进缓存键,防同名文件冲突

opcache.validate_timestamps=1

是否检查文件是否被修改

opcache.revalidate_freq=2

每隔几秒检查一次

opcache.revalidate_path=0

不在 include_path 里搜索优化

opcache.save_comments=1

保留注释(Doctrine、Laravel 注解依赖)

opcache.record_warnings=0

不重复记录编译警告

opcache.enable_file_override=0

不优化 file_exists

opcache.optimization_level=0x7FFFBFFF

优化级别位掩码

opcache.dups_fix=0

不修复重复类/函数定义

opcache.blacklist_filename=

黑名单文件

opcache.max_file_size=0

不限制文件大小

opcache.force_restart_timeout=180

计划重启等待时间

opcache.error_log=

错误日志路径

opcache.log_verbosity_level=1

日志详细程度

opcache.file_cache_fallback=1

Windows 下共享内存失败回退到文件缓存

opcache.file_cache=

二级文件缓存目录

opcache.file_cache_only=0

不只使用文件缓存

opcache.file_cache_consistency_checks=1

文件缓存校验

opcache.huge_code_pages=0

HugePages(Linux 特性,Windows 无效)

opcache.validate_permission=0

不验证文件权限

opcache.validate_root=0

不处理 chroot

opcache.opt_debug_level=0

调试级别

opcache.preload=

预加载脚本(高级功能)

opcache.preload_user=

预加载用户(Linux)

opcache.file_update_protection=2

文件修改后 2 秒内不缓存(防半写入)

opcache.lockfile_path=/tmp

锁文件路径(Linux)

opcache.jit=tracing

JIT 模式:tracing(追踪热点代码)

opcache.jit_buffer_size=128M

JIT 缓存区,必须 > 0 JIT 才生效

curl.cainfo ="D:\php832\extras\ssl\cacert.pem"

openssl.cafile="D:\php832\extras\ssl\cacert.pem"

含义:HTTPS 请求时验证证书用的 CA 证书包路径。

必须配置:否则 file_get_contents('https://...') 或 cURL 请求会报证书验证失败。

ffi.enable=preload

含义:FFI(Foreign Function Interface)允许 PHP 直接调用 C 函数。

安全风险:preload 只允许在预加载文件和 CLI 中使用,防止 Web 脚本调用任意系统库。