使用 laravel 缓存视图以优化磁盘 i/o

caching views with laravel to optimize disk i/o

我在 laravel 中有一个很小的 ​​subview/partial,它在 foreach 循环中加载 。我想将它保留在一个单独的视图中,因为将来我会扩展它并且我不想在我的主视图中乱放代码。但是,由于它是部分的,因此每次从磁盘加载时都会造成损失。

问题是:如何缓存视图并将新数据传递给它,而不必每次都从磁盘读取它?

您可以尝试手动创建一个新视图。它应该可以工作,但请注意,这完全未经测试:

<?php
    $view = View::make('your-partial');
    foreach($data as $model){
        $v = clone $view;
        $v->with('data', $model);
        echo $v->render();
    }
?>

编辑

我只是更深入地研究了一下,发现上面的内容对解决这个问题没有多大帮助。在您调用 render() 之前,不会读取视图文件,因此上面的代码仍会在每次迭代时读取文件。

render() 调用 getContents(),在引擎上调用 get(),然后再次调用 evaluatePath:

protected function evaluatePath($__path, $__data)
{
    $obLevel = ob_get_level();

    ob_start();

    extract($__data);

    // We'll evaluate the contents of the view inside a try/catch block so we can
    // flush out any stray output that might get out before an error occurs or
    // an exception is thrown. This prevents any partial views from leaking.
    try
    {
        include $__path;
    }
    catch (\Exception $e)
    {
        $this->handleViewException($e, $obLevel);
    }

    return ltrim(ob_get_clean());
}

如果你真的必须减少读取,我会说你唯一的选择是将部分视图代码直接放入另一个视图。