如何保存PHP中call_user_func_array()函数的输出结果
问题根因
你的输出缓冲操作顺序完全错误,才会出现内容输出到终端、文件为空的情况:
- 你在执行路由回调之前就调用
ob_get_contents()获取内容,此时输出缓冲中还没有任何路由生成的HTML - 执行
call_user_func_array()时你没有开启输出缓冲,回调生成的所有内容直接打印到了终端 - 最后调用
ob_end_clean()直接清空丢弃了缓冲内容,自然没有内容可以写入文件
修复后的代码
if (php_sapi_name() === "cli") { // 提前确认temp目录存在,避免写入失败 if (!is_dir('./temp')) { mkdir('./temp', 0755, true); } foreach ($router->get() as $route) { // 执行路由回调前先开启输出缓冲 ob_start(); // 执行路由回调,所有输出会被捕获到缓冲中 call_user_func_array($route['function'], []); // 一次性获取缓冲内容同时关闭并清空缓冲 $out = ob_get_clean(); // 写入文件 file_put_contents("./temp/" . $route['expression'] . ".html", $out); } }
额外注意事项
- 如果你的路由回调本身是返回HTML内容而不是直接echo输出,那不需要用输出缓冲,直接
$out = call_user_func_array($route['function'], [])拿返回值写入即可 - 注意
$route['expression']的值是否包含非法文件名字符,避免出现写入路径错误
内容的提问来源于stack exchange,提问作者devsimsek
相关产品推荐
相关产品推荐

