使用 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());
}
如果你真的必须减少读取,我会说你唯一的选择是将部分视图代码直接放入另一个视图。
我在 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());
}
如果你真的必须减少读取,我会说你唯一的选择是将部分视图代码直接放入另一个视图。