【问题标题】:How I can disable templates caching in development mode?如何在开发模式下禁用模板缓存?
【发布时间】:2013-06-03 00:19:37
【问题描述】:

每当我更改模板中的某些内容时,我都必须手动清除缓存。 有没有办法在开发模式下禁用模板缓存?

【问题讨论】:

  • 你指的是 Blade 吗?您不必像更改视图一样清除已编译的视图,Blade 会重新编译它。
  • 是的。我正在使用刀片。当我更新模板中的某些内容时,我没有看到任何变化。我必须手动从 app/store/views 目录中删除缓存文件。
  • 这是我的错。默认情况下,PhpStorm 会在上传后保留文件时间戳。
  • 我(认为我)有类似的需要禁用视图缓存,在我正在处理刀片扩展的情况下。更改 Blade::extend 代码不会导致视图缓存刷新。

标签: laravel laravel-4


【解决方案1】:

您可以尝试这个路由过滤器,将cache time 设置为 0,这样您的视图将在每个请求时重新创建:)

来自this gist

Route::filter('cache', function( $response = null )
{

    $uri = URI::full() == '/' ? 'home' : Str::slug( URI::full() );

    $cached_filename = "response-$uri";

    if ( is_null($response) )
    {
        return Cache::get( $cached_filename );
    }
    else if ( $response->status == 200 )
    {
        $cache_time = 30; // 30 minutes

        if ( $cache_time > 0 ) {
            Cache::put( $cached_filename , $response , $cache_time );
        }
    }

});

希望这对您有所帮助,但我没有测试它,所以我不能保证它会起作用。

【讨论】:

    【解决方案2】:

    从 PHP 5.3 升级到 PHP 5.5 的一些额外缓存问题可在此处获得:Laravel and view caching in development -- can't see changes right away

    【讨论】:

      【解决方案3】:

      看起来刀片正在使用文件时间戳来重建页面。

      因此,如果页面不直接由刀片更新,则有多种选择:

      1 - 如果您使用 FTP 或其他远程协议工作,您可能会在两个操作系统上遇到不匹配的日期。尝试将您的客户端放在未来或服务器放在过去(几​​秒钟就足够了)。

      提醒:对于基于 linux 的操作系统,一个简单的 date --set 可以工作,例如 date --set 18:30:00 用于 18h30 pm。

      2 - (转发wino 评论)您的客户可能不会更新您编辑文件的时间戳。您必须编辑 IDE 的配置。

      【讨论】:

      • 这行得通,谢谢!对我来说,我使用的是 phpStorm(使用 sftp 同步文件),我必须同时设置 opcache.revalidate_freq=0 并按照您的建议将服务器日期/时间设置为落后于我的客户端。
      • 事实上,对于在两个操作系统之间使用 FTP 访问,更新缓存时日期和时间会有所不同。由于 PhpStorm 对虚拟机的访问产生了这个问题,我更改了虚拟机的日期并且它工作了。
      【解决方案4】:

      如果你使用的是PHP5.5,那么我建议在php.ini配置opcache

      opcache.revalidate_freq=0
      

      此值设置应从缓存更新视图的时间频率。这个值通常是 60 秒左右。将其设置为 0 将使您的缓存每次都更新。

      【讨论】:

        【解决方案5】:

        当我不太了解您的配置时,调试起来会更加困难。我所能提供的所有帮助是您可以运行而不是直接删除视图缓存:

        $ php artisan cache:clear
        

        您可能会添加一个进程(取决于您的操作系统)来监听文件更改并自动运行命令。

        【讨论】:

          【解决方案6】:

          只需将其放在您的应用中的某个位置:

          if (env('APP_DEBUG')) ini_set('opcache.revalidate_freq', '0');
          

          【讨论】:

          • 正如@edvinas.me 所说,您需要 PHP 5.5+ 才能使用它。有关详细信息,请参阅This Question
          【解决方案7】:

          我用过几次“伽多玛”的解决方案。但是由于 Laravel 5 中不再有“filters.php”,这是我最新 Laravel 版本的中间件类:

          <?php
          namespace App\Http\Middleware;
          
          use Closure;
          use Illuminate\Contracts\Routing\Middleware;
          
          class CacheKiller implements Middleware {
          
              /**
               * @param  \Illuminate\Http\Request  $request
               * @param  \Closure  $next
               * @return mixed
               */
              public function handle($request, Closure $next)
              {
          
                  $cachedViewsDirectory = app('path.storage').'/framework/views/';
          
                  if ($handle = opendir($cachedViewsDirectory)) {
          
                      while (false !== ($entry = readdir($handle))) {
                          if(strstr($entry, '.')) continue;    
                          @unlink($cachedViewsDirectory . $entry);    
                      }
          
                      closedir($handle);
                  }
          
                  return $next($request);
          
              }
          
          }
          

          在你的 Kernel.php 中:

          protected $middleware = [
                  ...
                  'App\Http\Middleware\CacheKiller',
              ];
          

          不是最好的解决方案,但它确实有效。

          【讨论】:

          • 将缓存驱动更改为本地环境的数组。
          • 我不得不删除... implements Middleware。对了,当我设置缓存驱动:CACHE_DRIVER=array时,视图缓存文件继续写入:framework/views/。我仍然更喜欢不影响每个请求的解决方案。这暂时有效。谢谢你。 :)
          • 我在本地 dev .env 中添加了以下内容:ENABLE_MIDDLEWARE_KILL_VIEWS_CACHE=true 然后在中间件中: public function handle($request, Closure $next) { // 添加了这个块 if (!env(' ENABLE_MIDDLEWARE_KILL_VIEWS_CACHE')) { return $next($request); }
          【解决方案8】:

          根据这个request,将本地环境的应用程序缓存驱动更改为array

          【讨论】:

            【解决方案9】:

            在 laravel 5.2 中:创建一个新的中间件,在 Kernel.php 中添加到 'web' $middlewareGroups。这将调用 artisan 命令来清除所有已编译的视图文件。

            namespace App\Http\Middleware;
            
            use Artisan;
            use Closure;
            
            class ClearViewCache
            {
                /**
                 * Handle an incoming request.
                 *
                 * @param  \Illuminate\Http\Request  $request
                 * @param  \Closure  $next
                 * @return mixed
                 */
                public function handle($request, Closure $next)
                {
                    if (env('APP_ENV') === 'local') {
                        Artisan::call('view:clear');
                    }
            
                    return $next($request);
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-01-26
              • 1970-01-01
              相关资源
              最近更新 更多