为什么PHP8中执行exit语句后程序仍会继续运行?
问题原因
原生PHP8单独跑你贴的这段测试代码不可能输出after e,这个异常表现是CodeIgniter3的框架逻辑和PHP8的终止流程处理变化共同导致的:
- CodeIgniter3默认开启了全局输出缓冲,并且注册了shutdown回调来统一输出最终的页面内容
- PHP7及更早版本中调用
exit时,会直接丢弃所有未输出的缓冲内容,也不会执行框架注册的shutdown回调里的后续输出逻辑 - PHP8调整了终止阶段的执行逻辑:调用
exit后会先刷出所有激活的输出缓冲内容,并且会正常跑完所有已注册的shutdown函数 - 你写的
echo "after e\n"实际是框架在控制器方法执行完成后的后续输出逻辑,在PHP8下没有被exit阻断,所以会被正常打印出来
修复方法
要恢复和旧版本PHP一致的终止效果,选下面任意一种改法即可:
- 终止前手动清空所有输出缓冲,再调用exit:
function e() { echo "in e\n"; // 清空所有层级的输出缓冲 while (ob_get_level() > 0) { ob_end_clean(); } exit; }
- 直接用CodeIgniter3提供的输出终止逻辑:
function e() { echo "in e\n"; get_instance()->output->_display(); exit; }
内容的提问来源于stack exchange,提问作者mhkhung
相关产品推荐
相关产品推荐

