【问题标题】:Laravel 5.4 - php artisan cache:clear does not clear cache files when using 'file' cache driverLaravel 5.4 - php artisan cache:clear 使用“文件”缓存驱动程序时不清除缓存文件
【发布时间】:2018-01-15 06:48:21
【问题描述】:

Laravel 5.4 应用程序。在.env 中,CACHE_DRIVER 设置为file,QUEUE_DRIVER 设置为sync。

当我运行php artisan cache:clear 时,它显示Cache cleared successfully 但我的storage/framework/cache 目录中仍有236K 文件。

对此感到沮丧,我还使用 rm -rf * 从该目录中手动删除了 storage/framework/cache 下的所有文件/目录。

现在,当我运行art queue:restart 时,我得到[ErrorException] file_put_contents(/var/www/vhosts/my-app.com/releases/28/storage/framework/cache/ee/2f/ee2f842aa7bb1f53ed
f3a2ed2c09a1807ffa6c90): failed to open stream: No such file or directory

所以,我手头有两个问题。首先是:为什么Artisan没有删除所有缓存文件?如何安全地删除它们?第二个问题是:我如何从中恢复,以便php artisan queue:restart 不会在我身上出错?

更新:在我看来,如果 QUEUE_DRIVER 设置为 sync,我可能没有理由重新启动队列工作程序,因此完全跳过该命令可以解决我的一半问题。仍然不确定如何正确删除那些 236K 的缓存文件。

【问题讨论】:

  • 您找到解决方案了吗?我面临同样的问题,没有运气

标签: php caching laravel-5 queue laravel-artisan


【解决方案1】:

2020 年 1 月更新

似乎有一个简单的解决方案来解决所有这些问题。使用此答案 https://serverfault.com/a/96349 作为参考,您可以在父文件夹上设置 gid 位,以便在 ./storage/* 下创建的所有后续文件和文件夹都可以被正确组中的任何人写入,无论是谁创建的;从而克服组安全权限问题,如下所述。

这对我有用:

# Assumes all required users belong to the www-data group
sudo chgrp -R www-data /path/to/storage

sudo chmod g+s /path/to/storage

简答

使用 sudo:sudo rm -r ./storage/framework/cache

长答案

确保写入缓存的所有进程都使用同一个用户(而不仅仅是属于同一个组),因为事实证明 Laravel 写入缓存文件的权限类似于 0755 行,这限制了对所有者的写入。

如果你像我一样为这些使用不同的用户:

  • PHP 进程
  • Artisan CLI
  • 工匠通过主管(用于工作)

您最终会得到属于不同用户的文件,即使它们属于所需的组(例如 www-data),其他用户也无法写入或删除它们。

希望有人能找到一种方法将 Larvel 中的新缓存文件权限设置为 0775 之类的东西。如果它只是从父级继承就好了。

旁注

这对我来说也导致主管进程和 PHP 进程之间的Cache::remember() 出现问题,导致我收到put_file_contents 错误,因为不同用户无法写入缓存文件。

原答案

我遇到了同样的问题,在我的情况下,文件没有被删除,因为它们受到了写保护。当我使用rm -r ./storage/framework/cache 手动删除它们时,我收到了警告rm: descend into write-protected directory 'cache/c5'?。我不会为缓存中的每个文件都输入 yes,所以我运行了与 sudo 相同的命令,它运行顺利 sudo rm -r ./storage/framework/cache。

这回答了您的问题,即为什么 Artisan cache:clear 没有删除它们并运行 rm 是一个非常简单的解决方法;虽然它不能解决为什么文件被写为写保护的问题。

删除缓存后,Laravel 再次将缓存创建为写保护。这意味着它可能是一个错误并且需要有人向 Laravel 开发人员提交错误报告。由于解决方法很简单,我将把它留给其他人去做。

【讨论】:

  • 手动删除这些不会破坏任何东西?这就是 cache:clear 所做的一切,删除所有这些缓存文件吗?
  • 似乎有效,谢谢!虽然很奇怪,但使用 cache:clear 清除缓存在本地有效,但在生产环境中无效 =/
  • @Andrew 根据我的阅读和据我所知,所有cache:clear 所做的都是删除缓存文件。至于您的第二点,您可能是本地 sudo 的成员?
  • 查看 Illuminate\Cache\FileStore.php,flush 的情况是framework/cache/data 下面的每个目录都被删除。因此,我使用rm -rf framework/cache/data/*,这也可以防止缓存文件夹中的 .gitignore 被删除。
  • 注意 - 做简短的回答有时会导致删除的.gitignore 文件出现问题。如果可能的话,如果是权限问题,我更喜欢并发现只做sudo php artisan cache:clear 会更安全。
【解决方案2】:

你可以试试:

php artisan config:cache

它解决了我的大部分问题。

【讨论】:

  • 谢谢,但运气不好。没有解决问题。
  • Laravel 中有几个缓存 & config:cache 只清除和缓存应用程序配置文件。 Cache::remember() 方法创建的缓存文件是cache:clear 应该清除的内容。 config:cache 与 OP 问题无关。
【解决方案3】:

你也可以使用 Tinker:

php artisan tinker
Cache::store("file")->flush()

【讨论】:

    【解决方案4】:

    我最近遇到了类似的问题。通过Cache门面创建的缓存文件似乎在运行php artisan cache:clear之后仍然存在,正如@Precastic所提到的,原来是文件权限问题。

    我没有手动删除文件/文件夹,而是像这样以管理员权限运行相同的命令

    sudo php artisan cache:clear
    

    它对我有用。希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2017-03-09
      • 2019-10-14
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多