PHP7.1使ThinkPHP5的Cookie操作从静默失败变为显式报错:未捕获的写入失败抛出Throwable异常,非字符串key或负过期时间触发TypeError/Warning,httponly、samesite、secure等配置缺陷在PHP7.1下被严格暴露。

ThinkPHP5在PHP7.1环境下运行时,Cookie操作表面行为一致但底层机制存在关键差异:PHP7.1的错误处理升级使TP5中未捕获的Cookie写入失败会抛出Throwable异常,而PHP5.6下仅触发静默警告;同时PHP7.1严格类型检查会拦截TP5中传入非字符串key导致的setcookie()参数错位问题。
PHP7.1让TP5的Cookie写入失败从静默变为报错
在PHP5.6中,若TP5调用cookie('user', ['id' => 123])时数组值未被json_encode,底层setcookie()因第二个参数非字符串直接返回false,框架却忽略该返回值继续执行——开发者完全感知不到写入失败。PHP7.1将此类底层函数调用错误升级为Error实例,继承自Throwable,【必须用try-catch(Throwable $e)才能捕获,用catch(Exception $e)会漏掉】。
这一步操作起来很简单,直接把文件拖进去就行。
验证方法:在控制器中写cookie('test', []);然后用浏览器DevTools的Application→Cookies查看是否生成对应条目,PHP5.6下看不到却无提示,PHP7.1下会直接报“Warning: setcookie(): Invalid value”并中断后续逻辑。
立即学习“PHP免费学习笔记(深入)”;
TP5的cookie()函数在PHP7.1中对参数类型更敏感
方法一:传数组值时必须显式序列化
TP5默认允许cookie('data', [1,2,3]),PHP5.6会自动调用serialize()再urlencode;PHP7.1遇到非标量值直接拒绝,抛出TypeError。必须改写为cookie('data', json_encode([1,2,3], JSON_UNESCAPED_UNICODE))。
方法二:过期时间参数不能为负数
cookie('flag', 'on', -1)在PHP5.6中等效于立即过期,PHP7.1会触发“Warning: setcookie(): Expires header already passed”且不写入Cookie,【这个警告在CLI模式下不可见,仅HTTP响应头中丢失Set-Cookie】。
PHP7.1强制暴露TP5 Cookie配置中的安全缺陷
第一步:检查config.php中cookie配置项
找到'httponly' => false这一行,PHP5.6下即使不设此参数,部分老版本浏览器仍能读取Cookie;PHP7.1配合现代Chrome/Firefox会严格执行标准,【若httponly为false且页面含<script>,document.cookie可直接盗取session_token】</script>。
第二步:测试SameSite属性缺失影响
在TP5.1中未配置'samesite'时,PHP5.6生成的Cookie头不含SameSite字段,旧版浏览器忽略;PHP7.1+Chrome 80以上会默认按Lax策略处理,导致跨站POST请求丢失Cookie,登录态校验突然失败。
第三步:验证secure参数与HTTPS环境匹配性
PHP7.1下若服务器实际走HTTPS但配置中'secure' => false,浏览器直接丢弃该Cookie,而PHP5.6可能仍保留(取决于curl版本)。此时cookie('token')始终返回null,但$_COOKIE里却有原始值——这是PHP7.1更严格遵循RFC 6265的表现。



















