You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何保存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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 11:36:03