使用Laravel进行缓存清除

5
我正在开发一个系统,每当我更新公共文件夹中的任何内容时,所有计算机都必须清除其缓存,以使更改生效。
我只直接在公共文件夹中编写js和css文件。当我将它们推送到我的git仓库并通过ssh拉取到我们的共享主机后,我也通过ssh将它们复制到public_html文件夹中,但所有客户端计算机仍需手动清除缓存才能使用新的公共文件。我一直在学习laravel mix,但我仍然不确定如何在实际的主机上使用它。
我现在不确定缓存破坏是否是正确的术语,但我希望我的客户端计算机在更新系统时始终使用最新的资源。
4个回答

9
另一种快速而粗略的缓存破坏方法是使用文件的最后修改时间戳作为版本字符串。这样,如果您更新文件,时间戳也会更改。PHP中有filemtime方法可用于此操作。
我经常在WordPress中使用此方法,但在Laravel Blade模板中,它看起来像这样:
<script src="{{ asset('js/scripts.js') }}?ver={{ filemtime(public_path('js/scripts.js')) }}"></script>

我建议使用Laravel内置方式,因为它具有许多其他优点。但是这个技巧的原则在许多其他情况下也可能很有用。

使用内置的Laravel方式有什么优势? - Elwin
此外,为了避免泄露最后修改的时间,该值可以使用例如md5或更安全的bcrypt进行哈希处理。 - Elwin

4

我目前正在使用共享主机。我仍然不确定如何尝试它,但现在我理解的方式似乎是npm run production将所有文件编译到项目公共文件夹而不是根目录(public_html)。 - LEAD IT
@LEADIT 你可以在本地运行 npm run production,然后将 public 文件放在服务器的 public_html 文件夹中。但我通常不建议在共享主机上运行 Laravel。 - ceejayoz
它是否也需要我在实际托管中安装npm? - LEAD IT
VPS主机如今非常便宜。从AWS Lightsail起价为3.50美元。 - Pablo
@ceejayoz 我已经尝试过了,它可以正常工作。但是,当我在一个外部js文件中使用另一个文件中的函数时,它会返回一个错误,显示“未定义该函数”。 - LEAD IT

0
你可以在你的CSS和JS文件中包含一个版本。
<link rel="stylesheet" href="{{asset('css/style.css?v=3.0')}}"> //specific versioning
<link rel="stylesheet" href="{{asset('css/style.css?v='.rand(1,99))}}"> //random .. every it treats as a new file

1
“rand”方法不是一个好主意,除非您使用比99更高的上限。经常访问者会定期看到缓存的内容(可能在一次访问中看到几个不同的缓存版本),而不经常访问者将会产生更多的带宽使用和性能问题,因为CSS文件将在每个页面视图中重新加载。 - ceejayoz
@ceejayoz,我可以问一下您对此有什么建议吗?我也了解了一些版本控制的内容,但由于不同原因,有些人并不推荐使用它。 - LEAD IT
@LEADIT 请看我的回答。版本控制是人们处理这个问题的主要方式 - 你会发现几乎每个主要网站(包括 StackOverflow)都使用某种版本控制方法。我不知道“一些人”是谁,但他们给你提供了错误/过时的信息。 - ceejayoz
@ceejayoz,我很抱歉有些概括了,但我也在Stack Overflow上看到了这种回答,而你对他的回答的评论与此相似(他们使用版本控制的方式)。这就是为什么我正在寻找更好的方法,而我在你的评论中读到了。 - LEAD IT

0
根据被接受的答案,您可以使用Laravel Mix为资产添加版本号,但OP说他的资产代码目前位于public文件夹中。要使用Laravel Mix的方式,他需要将所有资产(js、css)从public转移到resource,添加.gitignore以忽略public中的资产文件夹,运行git rm -r --cached /public以完全从缓存中删除它们,然后运行npm run prod将资源生成到public中。这样,OP将继续使用Laravel的方式进行工作。
然而,如果OP确实想继续在public文件夹中工作(当前有太多资产),他/她可以使用composer包tooleks/laravel-asset-version。
您可以参考此处的Github存储库
注意:
您还可以在config/assets.php中添加版本号,或者可以在.env文件中添加版本号。

config/assets.php

<?php

return [
    ...
    'version' => env('VERSION', '0.0.1'),
];

运行npm i dotenv来安装dotenv(如果尚未安装)。
在根目录中进行必要的更改,并创建version.js文件。该文件将负责使用npm命令在.env中动态生成版本号。

version.js

const fs = require('fs');
const dotenv = require('dotenv');

// Load the .env file
dotenv.config();

// Specify the key and value you want to update or add
const today = new Date();
const year = today.getFullYear().toString().padStart(4, '0');
const month = (today.getMonth() + 1).toString().padStart(2, '0');
const day = today.getDate().toString().padStart(2, '0');

const key = 'VERSION';
const value = `${year}.${month}.${day}`;

// Update the .env file
const envFileContent = fs.readFileSync('.env', 'utf8');
const lines = envFileContent.split('\n');
let keyFound = false;

const updatedLines = lines.map((line) => {
  const [lineKey, lineValue] = line.split('=');
  if (lineKey === key) {
    keyFound = true;
    return `${lineKey}=${value}`;
  }
  return line;
});

if (!keyFound) {
  // Add a line break before adding the variable
  updatedLines.push('');

  // Add the key-value pair
  updatedLines.push(`${key}=${value}`);
}

const updatedEnvConfig = updatedLines.join('\n');

fs.writeFileSync('.env', updatedEnvConfig);

console.log(`Successfully updated ${key} in the .env file.`);

然后在你的 package.json 中添加
"scripts": {
    ...
    "version" : "node version.js"
},

现在你可以运行 npm run version,将版本号以 yyyy.mm.dd 的格式添加到 .env 文件中。如果需要的话,可以更改格式。
如果一切设置正确,你应该看到类似于 https://website.domain/path/to/asset.css?v=yyyy.mm.dd 的东西。

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