PHP中ob_start()疑问:为何未触发ob_application_framer回调函数
问题分析:ob_start()注册的回调未执行的原因
当前你的$_GET参数为Array ( [report] => ./history.php ),代码执行了Line A的echo "I am the right place";,随后调用ob_start('ob_application_framer');,但注册的回调函数ob_application_framer并未触发,核心原因和PHP输出缓冲区的工作机制有关:
ob_start()的作用是开启输出缓冲区并注册回调函数,它本身不会立即执行回调。回调函数只会在缓冲区被刷新或关闭时才会被调用,触发场景包括:脚本执行结束、调用ob_flush()/ob_end_flush()/ob_get_clean()等函数,或者缓冲区达到配置的大小上限。- 你的Line A输出是在
ob_start()之前执行的,这部分内容直接发送到浏览器,不会进入后续开启的缓冲区,因此不会被回调处理。 ob_start()开启缓冲区后,脚本没有再产生任何输出,也没有主动调用刷新/关闭缓冲区的函数。当脚本执行结束时,因为缓冲区是空的,PHP不会触发回调函数(没有内容需要处理)。
如果想要触发回调函数,可以做以下调整之一:
- 在
ob_start()之后添加输出内容,比如:
脚本结束时缓冲区有内容,就会自动调用回调处理。ob_start('ob_application_framer'); echo "需要被处理的内容"; - 主动调用缓冲区处理函数,比如:
ob_start('ob_application_framer'); // 即使没有输出,也可以手动触发处理 ob_end_flush();
另外注意:你的回调函数中调用了ob_application_handler($content),需要确保这个函数已经被定义,否则后续触发回调时会出现报错。
内容的提问来源于stack exchange,提问作者flash
相关产品推荐
相关产品推荐

