我和一些朋友决定开始一个项目,我们遇到了Laravel并认为这可能是一个很好的工具。我们开始在本地使用它来开发一些页面并注意到一些奇怪的东西。
当我们使用不同的信息更新视图时,在视图信息发生变化之前大约需要5到10分钟。这就像Laravel正在缓存视图并在其上放置一个TTL。
我知道这不是我在本地Web服务器上所做的任何事情,因为我使用过其他框架而且我从未遇到过这个问题。
在搜索互联网时,我找不到如何禁用此功能的好答案。我想使用Laravel,但是如果每次想要进行更改时我的视图需要一段时间才能更新,那么它会变得毫无价值。事实上,这听起来适得其反。
有没有办法禁用它?为什么我的观点需要永远更新,开箱即用?
答案 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,则忽略此配置指令。”
对我来说就是这种情况。