用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4394|回复: 2
收起左侧

[优化] CI中CodeIgniter.php有一处对safe_mode判断不够严谨

[复制链接]
发表于 2012-5-15 17:24:05 | 显示全部楼层 |阅读模式
本帖最后由 broshan 于 2012-6-3 17:48 编辑

开启log中出现下面这条记录

ERROR - 2012-05-15 08:34:45 --> Severity: Warning  --> set_time_limit() [<a href='function.set-time-limit'>function.set-time-limit</a>]: Cannot set time limit in safe mode D:\sanguo\server_game\system\core\CodeIgniter.php 107

CI中对安全模式的判断如下:
if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
问题出在ini_get返回值的判断上

针对ini_get函数的返回值有几种
php手册中对ini_get返回值的描述如下:
Note: When querying boolean values
A boolean ini value of off will be returned as an empty string or "0" while a boolean ini value of on will be returned as "1". The function can also return the literal string of INI value.

Off的时候返回空字符串或"0",On的时候返回"1",还可以返回INI中写的值

倒霉就倒霉在最后一句话上,没有说具体什么时候返回INI value,恰巧就被我遇到了
导致CI判断出了问题


发表于 2012-5-23 16:25:00 | 显示全部楼层
完全是技术流啊。
 楼主| 发表于 2012-6-3 16:22:52 | 显示全部楼层
本帖最后由 broshan 于 2012-6-3 17:38 编辑

if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
完整的判断应该写成
$safe_mode = @ini_get("safe_mode");
if(strtolower($safe_mode) === 'off') {
    $safe_mode = FALSE;
}
if (function_exists("set_time_limit") == TRUE AND (boolean)$safe_mode === FALSE)

略显蛋疼



本版积分规则