Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[5.x] Fix static caching invalidation for multi-sites #10669

Open
wants to merge 22 commits into
base: 5.x
Choose a base branch
from

Conversation

duncanmcclean
Copy link
Member

This pull request fixes some issues around Static Caching invalidation & Multi-sites, when the queue driver is set to anything other than sync.

When the DefaultInvalidator class passes down the invalidation rules from the config, it does so without specifying the domain in which the URLs should be invalidated.

$this->cacher->invalidateUrls(
Arr::get($this->rules, "collections.{$entry->collectionHandle()}.urls")
);

The invalidateUrls method attempts to get the domain from the invalidation URLs in the config (which is why the mentioned workaround works).

When an invalidation rule doesn't include a domain, it'll attempt to get the site's "base URL" using AbstractCacher::getBaseUrl():

public function getBaseUrl()
{
// Check 'base_url' for backward compatibility.
if (! $baseUrl = $this->config('base_url')) {
// This could potentially just be Site::current()->absoluteUrl() but at the
// moment that method gets the URL based on the request. For now, we will
// manually get it from the config, as to not break any existing sites.
$baseUrl = Str::startsWith($url = Site::current()->url(), '/')
? Str::removeRight(config('app.url'), '/').$url
: $url;
}
return rtrim($baseUrl, '/');
}

This method then calls Site::current() which gets the domain by getting the current site, based on the request URL.

However, since we're in the context of a queue, there is no request, so Statamic falls back to the "default" site URL, which causes the path on the intended site to not get invalidated (intended being the site the entry is associated with).

This pull request attempts to fix this by including the domain in the array of URLs passed to invalidateUrls.

Fixes #7691.
Replaces #10517.

@duncanmcclean duncanmcclean marked this pull request as draft August 20, 2024 14:54
@duncanmcclean duncanmcclean marked this pull request as ready for review August 27, 2024 14:58
@duncanmcclean
Copy link
Member Author

duncanmcclean commented Aug 27, 2024

This is ready for review now.

The only thing I noticed while testing this PR on a real site was the fact that the GlobalVariablesSaved event is dispatched for every site whenever one site's globals are updated.

This means that whenever you update a global set, the global set will be invalidated in all sites, rather than just the site the global was just updated in.

I've opened a separate issue for that, as it'll likely require a breaking change in order to fix: #10888

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Cache is not getting invalidated in Multisite setup
1 participant