At the moment I'm not running Squid for this site but if experimentation time permits I'll have it running again soon. One thing I feel uneasy about is how to "manually" purge cached pages that needs to be updated. For example, if you read this page (and it's cached for one hour) and post a comment, then I'd like to re-cache this page with a purge. Setting a HTTP header could be something but that I would only be able to do on the page where you have this in the URL:


?msg=Comment+added

which, because of the presence of a querystring, is not necessarily cached anyway. The effect is that as soon as the "?msg=Comment+added" is removed from the URL, the viewer will see the page as it was before she posted her comment. squidclient might be the solution. ...sort of.

squidclient is an executable program that you get when you install the squid cache server. As described in this documentation you can manually purge any cache on a site which would have the desired effect to the problem mentioned above. The only problem is that I have about 30-60 posted comments per day and that would be a hell of a lot of command line calls to squid. Secondly, they'd probably be quite slow and the person posting a comment won't be prepared to wait that long. The code for this would be something like this:


cmd = 'squidclient -m PURGE %s' % self.absolute_url()
result = os.popen4(cmd).read()
return result.find('200 OK') > -1

(obviously this would need to be wrapped in some security assertions)

An even better solution exists only as a dream. A Python binding for squidclient that I can use directly from my Zope Python code:


# <pseudocode>
import pysquidclient
server = pysquidclient.Server('localhost', 80)
r = server.purgeURL(self.absolute_url())
return r.isOK()
# </pseudocode>

Imagine that! You could create the server instance for the duration of the Zope server running just call the purgeURL() function multiple times thus saving looooads of time. I guess it might be worth testing the os.popen4() method to see if it works. If it doesn't work, then maybe it's time to start looking at ESI

UPDATE

Thanks Kevin (and Seb) for pointing this out. The solution is something like this:


(scheme, host, path, params, query, fragment
            ) = urlparse.urlparse(objecturl)
h = httplib.HTTPConnection(host)
h.request('PURGE', path)
r = h.getresponse()
return r.status, r.reason

Comments

Anon

Hej Peter!
Squidclient uses HTTP, so there are lots of python clients to choose from already.

I'm pretty sure that Zope supports automatic purging already. Look at the "Web Accelerator" (or something like that) product. I haven't touched it in a while.

Kevin

Peter,

Take a look at lib/python/Products/StandardCacheManagers/AcceleratedHTTPCacheManager.py::ZCache_invalidate for how to do it...

hth

Kevin

Peter Bengtsson

Thanks Kevin and Anon. See my UPDATE above.

Your email will never ever be published.

Previous:
Best Image Replacement Technique guide October 7, 2005 Web development
Next:
table-layout: fixed October 13, 2005 Web development
Related by category:
How I run standalone Python in 2025 January 14, 2025 Python
get in JavaScript is the same as property in Python February 13, 2025 Python
How to resolve a git conflict in poetry.lock February 7, 2020 Python
Best practice with retries with requests April 19, 2017 Python
Related by keyword:
Make your NextJS site 10-100x faster with Express caching February 18, 2022 Node, Nginx, React, JavaScript
How I simulate a CDN with Nginx May 15, 2019 Python, Nginx
Is Nginx obsolete now that we have Amazon CloudFront? July 28, 2012 Web development
Custom CacheMiddleware that tells Javascript a page is cached in Django August 24, 2009 Django