PHP:ini_set设置max_execution_time/input_time后ini_get返回默认值
嘿,先看你贴的代码,首先就发现一个低级但致命的语法错误:
<?php ini_set('max_execution_time', 100); ini_set('max_input_time', 100); echo ini_get('max_execution_time') . "\n"; echo ini_get('max_input_time') . "\n"; // 你原来的代码里是`ini_get('max_input_time)`,少了右边的闭合引号! // 这个语法错误会直接导致脚本报错终止,根本没机会执行到设置后的读取操作,这可能是你看到默认值的原因之一
假设你修正了这个语法错误后,问题依然存在,那我们来一步步排查其他可能的原因:
可能的原因及解决办法
服务器配置用
php_admin_value锁定了参数
如果你的PHP运行在Apache、Nginx-FPM这类服务器环境中,管理员可能在服务器配置文件(比如Apache的httpd.conf、.htaccess,或者Nginx的fastcgi_params)里用php_admin_value max_execution_time 30来强制设置值。这种方式定义的参数是完全无法通过脚本内的ini_set修改的。你可以运行phpinfo()查看参数详情:找到max_execution_time和max_input_time的行,看Local Value是否始终和Master Value一致,且Changeable列显示No——如果是这样,就只能联系管理员调整服务器配置,或者自己修改对应配置文件(如果你有权限的话)。max_input_time的生效时机问题
max_input_time是限制脚本接收输入(比如POST数据、文件上传)的时间,这个参数的生效时机是在脚本执行之前。也就是说,当你的脚本开始执行ini_set的时候,输入阶段已经结束了。如果你的脚本挂起是因为接收输入超时,那在脚本里设置这个参数完全没用,必须提前在php.ini或者服务器配置里把这个值调大。确认安全模式(针对PHP 5.3及以下版本)
虽然你说PHP没开安全模式,但还是建议用phpinfo()确认一下safe_mode的状态。安全模式下很多ini参数是无法通过脚本修改的,不过PHP 5.4之后已经移除了安全模式,所以如果是新版本PHP可以直接排除这个原因。
快速验证步骤
先修正语法错误,然后运行下面的脚本查看配置详情:
<?php // 修正引号错误 ini_set('max_execution_time', 100); ini_set('max_input_time', 100); echo "设置后读取的max_execution_time: " . ini_get('max_execution_time') . "\n"; echo "设置后读取的max_input_time: " . ini_get('max_input_time') . "\n"; // 输出完整配置信息,重点看这两个参数的Changeable状态 phpinfo();
运行后找到对应参数的部分:
- 如果
Local Value是你设置的100,说明语法错误是唯一问题; - 如果
Local Value还是默认值,且Changeable是No,说明被服务器配置锁定了; - 如果是
max_input_time始终不变,那大概率是生效时机的问题,需要提前在配置文件中设置。
内容的提问来源于stack exchange,提问作者ma77c

