Laravel 5 - 清除共享托管服务器缓存

162

问题非常明确。

php artisan cache:clear

有没有绕过命令行,但不使用CLI来清除缓存的方法,我使用的是流行的共享托管服务,但根据我的计划,我没有控制面板访问权限。

我想清除视图缓存。

我看到一个几乎和这个问题相同的问题,但它对我没有帮助。


2
在共享主机上运行Laravel是疯狂的,我认为,正是因为这种原因。你如何运行迁移? - ceejayoz
@ceejayoz.. 其实我刚开始这个项目,也是我的第一个 Laravel 项目。我还没有涉及到这个迁移的事情... - Rinto George
14
在共享主机上运行 Laravel 真的很疯狂。但这就是现实,有时候你不得不这么做,因为别无选择。 - elb98rm
这在 Laravel 8 中有效。 - Azade
21个回答

188

您可以在CLI之外调用Artisan命令。

Route::get('/clear-cache', function() {
    $exitCode = Artisan::call('cache:clear');
    // return what you want
});

你可以在这里查看官方文档。


更新

目前没有办法删除视图缓存。即使是php artisan cache:clear也不能做到。

如果你真的想要清除视图缓存,我认为你需要编写自己的artisan命令,并像之前说的那样调用它,或者完全跳过artisan路径,在某个从控制器或路由中调用的类中清除视图缓存。

但是,我的真正问题是你真的需要清除视图缓存吗?在我现在正在工作的项目中,我有近100个已缓存的视图,它们的大小不到1 Mb,而我的vendor目录超过40 Mb。我不认为视图缓存对磁盘使用是一个真正的瓶颈,并且从未真正需要清除它。

至于应用程序缓存,它存储在storage/framework/cache目录中,但仅当您在config/cache.php中配置了file驱动程序时才会这样。您可以选择许多不同的驱动程序,如RedisMemcached,以改善基于文件的缓存性能。


1
你想要清除哪个缓存?cache:clear 命令适用于 应用程序缓存,即从 Cache 门面访问的缓存。 - Marco Pallante
谢谢解释!我不担心磁盘空间 :) 但是有一个问题,如果视图缓存没有清除,那么视图中的新更改如何影响网站?在Laravel中是否发生任何I/O检查? - Rinto George
1
我认为它对文件进行时间戳检查,这比重新构建 Blade 模板更快。 - Marco Pallante
是的,我想是这样,无论如何你帮助我以正确的方式思考,谢谢! - Rinto George
1
“没有办法删除视图缓存”这并不是事实。您可以使用 php artisan view:clear 命令来清除缓存。 - jfadich
显示剩余2条评论

85

前往 laravelFolder/bootstrap/cache,然后将 config.php 重命名为任何你想要的名称,例如 config.php_old,重新加载你的网站。这应该像巫术一样起作用。


1
我确认。适用于 Laravel 5.4。我致敬。 - simon
1
确认在将 Laravel 5.4 从 Windows 主机迁移到共享主机时,它消除了许多烦恼...谢谢! - Rikudo Pain
1
在某些情况下,这似乎是唯一有效的解决方案。如果您有一个缓存的配置文件,然后删除了一个Facade或Service Provider,当您运行命令创建新的缓存配置时,它会使用现有的缓存配置运行,并尝试引用不再存在的Facade和/或Service Provider类而失败。另一个选择是从配置文件中删除引用,重新生成缓存配置,然后删除实际的Facade和/或Service Provider类。 - Jason Wheeler
2
对于 Laravel 6.6,要删除缓存,我只需删除 cache 文件夹和 .env 文件中的默认缓存值。但是在删除所有这些之后,再次出现问题...当运行 php artisan optimize 时。最终,我通过更改 config.php 文件中的键值来解决了这个问题,而不是重命名。感谢 @DeadGuy。 - Chandan Sharma
1
确认它仍然适用于Laravel 9。非常感谢! - Imtiaz
1
使用最新的Laravel 5.4.22进行开发。 - aswzen

63

据我所见:http://itsolutionstuff.com/post/laravel-5-clear-cache-from-route-view-config-and-all-cache-data-from-applicationexample.html

使用新的清除缓存命令,下面的代码是否可行:

//Clear Cache facade value:
Route::get('/clear-cache', function() {
    $exitCode = Artisan::call('cache:clear');
    return '<h1>Cache facade value cleared</h1>';
});

//Reoptimized class loader:
Route::get('/optimize', function() {
    $exitCode = Artisan::call('optimize');
    return '<h1>Reoptimized class loader</h1>';
});

//Route cache:
Route::get('/route-cache', function() {
    $exitCode = Artisan::call('route:cache');
    return '<h1>Routes cached</h1>';
});

//Clear Route cache:
Route::get('/route-clear', function() {
    $exitCode = Artisan::call('route:clear');
    return '<h1>Route cache cleared</h1>';
});

//Clear View cache:
Route::get('/view-clear', function() {
    $exitCode = Artisan::call('view:clear');
    return '<h1>View cache cleared</h1>';
});

//Clear Config cache:
Route::get('/config-cache', function() {
    $exitCode = Artisan::call('config:cache');
    return '<h1>Clear Config cleared</h1>';
});

对每个人都开放清除缓存的可能性并非必要,尤其是在生产环境中,因此我建议注释掉那些路由,需要清除缓存时再取消注释并运行这些路由代码。


2
我发现这段代码片段非常有用。 - Haseeb Zulfiqar
1
我在config:cache上遇到了问题,它在路由或控制器中无法工作,但其他地方都可以。可能出了什么问题? - nayeemdev

51

配置缓存 Laravel的配置文件分布在多个文件中,为每个请求包含所有这些文件是一个昂贵的过程。要将所有配置文件合并为一个,请使用:

php artisan config:cache

请记住,一旦缓存配置信息,对配置的任何更改将不会产生任何影响。要刷新配置缓存,请再次运行上面的命令。如果您想完全摆脱配置缓存,请运行:

php artisan config:clear

路由缓存 在 Laravel 中,路由也是一项昂贵的任务。为了缓存 routes.php 文件,请运行下面的命令:

php artisan route:cache

请注意,它不适用于闭包。如果您正在使用闭包,这是将它们移动到控制器的绝佳机会,因为artisan命令将在尝试编译绑定到闭包而不是适当的控制器方法的路由时抛出异常。 与配置缓存相同,对routes.php的任何更改都将不再产生任何影响。要刷新缓存,请每次对路由文件进行更改时运行上述命令。要完全摆脱路由缓存,请运行以下命令:

php artisan route:clear

类映射优化

一个中等规模的项目通常会分布在数百个PHP文件中。按照良好的编码习惯,每个东西都应该有自己的文件。当然,这也不是没有缺点的。每次请求,Laravel必须包含数十个不同的文件,这是一件开销很大的事情。

因此,一种很好的优化方法是声明每个请求所使用的文件(例如所有的服务提供者、中间件和其他一些文件),并将它们合并为一个文件,然后在每个请求中加载这个文件。这与将所有JavaScript文件合并成一个文件的操作相似,从而浏览器需要向服务器发出更少的请求。

额外的编译文件(例如:服务提供者、中间件等)应由您在config/compile.php中的files键中声明。一旦您将每个请求所需的所有内容放入其中,则可以使用以下命令将它们合并为一个文件:

php artisan optimize --force

优化composer的自动加载

这个问题不仅适用于laravel,也适用于任何使用composer的应用程序。

我先解释一下PSR-4 autoload是如何工作的,然后告诉你应该运行哪个命令来优化它。如果你对composer的工作原理不感兴趣,我建议你直接跳到控制台命令。

当你请求composer获取App\Controllers\AuthController类时,它首先在classmap中搜索直接关联。classmap是一个类和文件1对1关联的数组。由于你肯定没有手动将Login类及其关联文件添加到classmap中,因此composer会继续搜索命名空间。 因为App是PSR-4命名空间,它默认与Laravel相关联,并与app/文件夹相关联,因此composer将尝试使用基本字符串操作将PSR-4类名转换为文件名。最终,它猜测App\Controllers\AuthController必须位于AuthController.php文件中,该文件位于一个Controllers/文件夹中,应该幸运地位于命名空间文件夹app/中。

所有这些辛苦工作只是为了得出结论: App\Controllers\AuthController类存在于app/Controllers/AuthController.php文件中。为了让composer扫描整个应用程序并创建直接的类和文件1对1关联,请运行以下命令:

composer dumpautoload -o

请注意,如果您已经运行了php artisan optimize --force,则不必再运行此命令。因为optimize命令已经告诉composer创建了一个优化的自动加载。


46

这个软件包适用于 php ^7.0 和 ^laravel5.5

只能在我为此目的创建的cronjob中使用此软件包。我之前也遇到了同样的情况。 https://packagist.org/packages/afrazahmad/clear-cached-data 安装它并运行:

php artisan clear:data

它将自动运行以下命令。

php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan clear-compiled
php artisan config:cache

希望这能有所帮助。

如果您想在特定时间自动运行它,那么您首先需要设置cronjob。 例如:

 in app/console/kernel.php

在计划函数中:

$schedule->command('clear:data')->dailyAt('07:00');

17

基本上,我想要清除视图缓存。

现在 Laravel 5.1 中已经有一个命令可以完成此操作。

php artisan view:clear

15

要在CLI之外清除所有缓存,这样做;这对我有效。

Route::get('/clear', function() {

   Artisan::call('cache:clear');
   Artisan::call('config:clear');
   Artisan::call('config:cache');
   Artisan::call('view:clear');

   return "Cleared!";

});

config:cache 将清除并缓存配置 - 所以我想不需要同时添加。 - Raja Khoury
当然可以。你只需要使用你需要的那一行即可。 - Amos Chihi

14

这个命令可以一次性清除所有类型的缓存:

$ php artisan optimize:clear

这是一个别名:

$ php artisan view:clear
$ php artisan config:clear
$ php artisan route:clear
$ php artisan cache:clear
$ php artisan clear-compiled

此方法添加于Laravel 5.7


11

您可以通过FTP连接并清除 laravel 5storage\framework\views 文件夹或者 laravel 4app\storage\views


4
php artisan view:clear

将清除缓存的视图


1
被问到了替代命令php artisan cache:clear的问题。这个命令不会清除存储在storage文件夹中的已查看缓存,而这正是所需的。 - Spidi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接