Laravel和在开发中查看缓存 - 无法立即看到更改

时间:2013-12-14 02:55:35

标签: php caching laravel laravel-4

我和一些朋友决定开始一个项目,我们遇到了Laravel并认为这可能是一个很好的工具。我们开始在本地使用它来开发一些页面并注意到一些奇怪的东西。

当我们使用不同的信息更新视图时,在视图信息发生变化之前大约需要5到10分钟。这就像Laravel正在缓存视图并在其上放置一个TTL。

我知道这不是我在本地Web服务器上所做的任何事情,因为我使用过其他框架而且我从未遇到过这个问题。

在搜索互联网时,我找不到如何禁用此功能的好答案。我想使用Laravel,但是如果每次想要进行更改时我的视图需要一段时间才能更新,那么它会变得毫无价值。事实上,这听起来适得其反。

有没有办法禁用它?为什么我的观点需要永远更新,开箱即用?

7 个答案:

答案 0 :(得分:24)

#laravel IRC频道是神派。这与Laravel的行为毫无关系。这实际上是PHP 5.5正在做的事情。

这个令人困惑的原因是因为我将我的PHP版本从5.3升级而且从未遇到过这个问题。

在.ini文件中,您需要调整OPcache设置。对我来说,这些设置从.ini文件中的第1087行开始,看起来像这样:

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

特别注意opcache.revalidate_freq=60。这实际上是使您的视图缓存。如果这不是所需的行为,请将值设置为0,每次进行更改时,您的视图都会更新。耶!

2014年8月21日编辑

如下面的Matt所述,请确保重新启动Web服务器,以便在更改.ini文件后更改生效。

答案 1 :(得分:3)

对于较新版本的PHP,opcache不起作用。这是我使用的(在app / filters.php中):

App::before(function($request)
{
    // Clear view cache in sandbox (only) with every request
    if (App::environment() == 'sandbox') {
        $cachedViewsDirectory=app('path.storage').'/views/';
        $files = glob($cachedViewsDirectory.'*');
        foreach($files as $file) {
            if(is_file($file)) {
                @unlink($file);
            }
        }
    }
});

答案 2 :(得分:2)

这可能根本不是缓存问题,与Laravel,Apache或PHP没有任何关系。如果您要将文件共享到Vagrant等虚拟机中,请确保编辑器在编写文件时没有使用“原子保存”。

要对此进行测试,请使用多个不同的文本编辑器对观看的文件进行小编辑(单个字符)。 VM的文件系统可能不会注意到实现原子保存的编辑器保存的更改。

我正在使用Mac上的Sublime Text 3进行编辑,将文件保存到使用NFS挂载到Vagrant VM的文件夹中。正在通过Gulp在本地文件系统上监视文件,并且每当文件发生更改时,都会从Vagrant主机请求livereload刷新。

使用默认atomic_save: true使用Sublime Text 3更改单个字符会触发更改,但不会提供更新的文件。在Vim,TextEdit,Sublime Text 2和TextWrangler中编辑都触发了更新并提供了更新的文件内容。切换到atomic_saves: false会使Sublime Text 3与其他编辑器内联,触发更新并提供正确的文件。

Sublime Text 3的默认首选项包括以下注释:

// Save via writing to an alternate file, and then renaming it over the
// original file.
"atomic_save": true,

问题可能与写入未读取的临时文件的更改有关,然后该临时文件替换我们监视的文件。在写入临时文件时进行修改,而不是在替换我们正在观看的文件时进行修改,因此不会触发更新。那个或者什么与NFS缓存或VirtualBox的NFS网关 - 中间有很多东西。

在发现这只是一个编辑器设置之前,花了很多时间浪费了opcache,Apache mods和Laravel hacks。

答案 3 :(得分:1)

由于上传的图片没有刷新,我在管理员中试图避免缓存时遇到了同样的问题。我不建议为所有php应用程序禁用缓存,您可以更改标题。在app/filters.php

中添加/编辑此功能
Route::filter('after', function($response)
{
    // No caching for pages, you can do some checks before
    $response->header("Pragma", "no-cache");
    $response->header("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0");
});

答案 4 :(得分:1)

如果您正在使用VM(如Vagrant)并且通过NFS从主机共享文件,则另一种可能性是NFS正在缓存修改时间。这将导致Laravel认为缓存的编译模板仍然是新鲜的。这就是我今天遇到的问题,我通过添加NFS挂载选项lookupcache=none来解决它(以及gulp-watch的相关问题没有注意到样式表和javascript源文件正在发生变化)。

我在这里写到:Watching files for changes on Vagrant, file modification times not updating

答案 5 :(得分:0)

我还必须调整日期/时间。

我正在使用phpStorm与VirtualBox Laravel Homestead同步我的文件(since it will keep server pages loading faster on the VM)。除了opcache.revalidate_freq=0修复,我还必须确保Homestead VM的日期/时间早于主机操作系统。否则系统不会认为有任何改变。

在ubuntu中,执行sudo dpkg-reconfigure tzdata并设置您的时区。然后,如果您的主机操作系统当前位于上午11:01:00,请将VM设置为稍早的时间sudo date --set 11:00:50

然后sudo nginx restart。像魅力一样工作!

答案 6 :(得分:0)

此外,不要忘记这取自: http://php.net/manual/en/opcache.configuration.php#ini.opcache.revalidate-freq

“如果禁用opcache.validate_timestamps,则忽略此配置指令。”

对我来说就是这种情况。