如何禁用 Laravel 视图缓存?

Posted

技术标签:

【中文标题】如何禁用 Laravel 视图缓存?【英文标题】:How do I disable Laravel view cache? 【发布时间】:2014-11-06 22:13:08 【问题描述】:

我的一个观点有一个例外。但是,laravel 并没有告诉我视图的名称以便我找到并修复它,而是说它在 app/storage/views/110a3ecc0aa5ab7e6f7f50ef35a67a8b 中,这毫无意义。

如何禁用此视图缓存,以便 laravel 使用并引用实际文件?

【问题讨论】:

Laravel and view caching in development -- can't see changes right away的可能重复 @RobbieP 该问题是指 php 缓存,是一个完全独立的问题。我的问题是关于 laravel 的内置视图缓存系统的,不是重复的。 我一定是看错了你的问题。 Laravel 需要在渲染之前编译你的刀片文件,所以我不确定你是否能够看到错误发生在哪个命名视图中,但你可以打开编译后的视图。在此处查看@Antonio 的答案***.com/a/19866546/942846 【参考方案1】:

开箱即用?你不能。但是您可以扩展 BladeCompiler 类,重写负责检查视图是否已过期的方法:

class MyBladeCompiler extends BladeCompiler 

    public function isExpired($path)
    
        if ( ! \Config::get('view.cache'))
        
            return true;
        

        return parent::isExpired($path);
    


您需要用自己的编译器替换 IoC 容器中的 BladeCompiler 实例:

$app = App::make('app'); // or just $app = app();

$app->bindShared('blade.compiler', function($app)

    $cache = $app['path.storage'].'/views';

    return new MyBladeCompiler($app['files'], $cache);
);

然后你只需要在你的 app/config/view.php 文件中创建那个键

<?php

return [

    'cache' => false,

    'paths' => [base_path().'/resources/views'],

    'pagination' => 'pagination::slider-3',

];

或者,就像我在这里做的那样:

return [

    'cache' => in_array(App::environment(), ['production', 'staging']),

];

【讨论】:

我可以把第二部分代码放在哪里?在 AppServiceProvider 中? 我尝试在AppServiceProvider中添加,但它没有调用isExpired方法。在 5.5 中也将 bindShared 重命名为单例 AppServiceProvider 对我也不起作用。该绑定被核心 ViewServiceProvider 覆盖。我通过使用带有新 registerBladeEngine() 方法的自定义类扩展 ViewServiceProvider 克服了这个问题,并在 config/app.php 中的 providers 数组中用我的自定义类替换了核心 ViewServiceProvider【参考方案2】:

在开发环境中,我只是添加和修改下一个:

bootstrap/start.php

$env = $app->detectEnvironment(function()return 'testing';);

app/config/testing/cache.php 加入数组

'cache' => false,

app/config/view.php加入数组

'cache' => false,

【讨论】:

不起作用。这可能是由于 laravel 版本 - 我目前使用的是 4.1;这在以后的版本中有所改变吗?【参考方案3】:

解决方案

打开 php.ini

opcache.revalidate_freq=0
opcache.fast_shutdown=0

改成这个。重启apache。

【讨论】:

这和 laravel 有什么关系? 那么可能你的问题不是 laravel 缓存,而是 php 缓存——这些设置与 php opcache 有关,这与 laravel 视图缓存不同。【参考方案4】:

虽然有些人会说这是粗略的,但这是在我正在开发的小型应用程序上执行此操作的最快和最简单的方法

在我的路由指向的控制器上:

public function __construct()

    exec('php /full/path/to/artisan view:clear');

【讨论】:

如果性能和可扩展性是您项目的重要目标,我建议不要使用这种方法。 我建议永远不要使用exec tbh.. 但如果你绝望:) 你现在可以使用Artisan门面来避免使用exec:Artisan::call('view:clear')【参考方案5】:

Laravel 创建视图缓存文件,因为它已被告知这样做。在.env 文件中,您会遇到cache_driver,它的默认属性为file,将其更改为array

【讨论】:

请发布 .env 文件的示例 sn-p。【参考方案6】:

检查您的 .env 文件 将 CACHE_DRIVER=file 更改为 CACHE_DRIVER=array

【讨论】:

【参考方案7】:

这对我有用...将其添加到 .env 文件中

CACHE_EXPIRE=-1

【讨论】:

【参考方案8】:

如果你有artisan,清除缓存很容易

php artisan view:clear

如果你没有或不想要artisan(想不出你为什么不想要它,它非常有用),你可以从你的项目的根目录做

cd storage/framework/views/
rm *.php

【讨论】:

【参考方案9】:

不过,聚会有点晚了。 我遇到了同样的问题:浏览器没有反映对 php 代码的更改。

对我来说简单的解决方案是:

将服务器上的时钟设置为与开发计算机相同的时间!

sudo date +%T -s "11:14:00"

【讨论】:

【参考方案10】:

您也可以通过这种方式清除缓存:

// Clear cache in laravel
Route::get('/clear-cache', function() 
    Artisan::call('cache:clear');
    // return what you want
    return "Cache is cleared";
);

【讨论】:

【参考方案11】:

这是完整的答案

转到 vendor/illuminate/BladeCompiler.php 改变这两行

使用 Illuminate\View\Compilers\Compiler; 类 BladeCompiler 扩展 Compiler 实现 CompilerInterface

以下内容:

使用 App\Support\CustomCompiler; 类 BladeCompiler 扩展 CustomCompiler 实现 CompilerInterface

在您的 app/support 文件夹(或您使用的任何结构)中 创建以下类

命名空间应用\支持;

use Illuminate\View\Compilers\Compiler;

class CustomCompiler extends Compiler 

    public function isExpired($path) 

        if ( !\config('blade.use_cache')) 
               return true;

        return parent::isExpired($path);
    

您的刀片配置文件将如下所示

return [
    'use_cache' => false,
    'cache' => storage_path('cache'),
    'views' => resources_path('views')
];

自动转储并运行....

【讨论】:

【参考方案12】:

如果您使用 MAMP,请在 Preferences、General、PHP-Cahce 下禁用 OPCache。只需选择关闭。稍后谢谢我。

【讨论】:

以上是关于如何禁用 Laravel 视图缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 视图缓存是如何工作的?

Laravel 视图不刷新

从php laravel禁用memcached

Laravel 存储视图缓存到 Redis

在 Laravel 4 中缓存视图输出

即使清除缓存 laravel 后视图也不刷新