My Varnish project

admin admin at adofms.com.au
Tue May 29 11:20:54 CEST 2007


Hello,

Thank you very much for an excellent product.  I wish to use Varnish
cache as a front end to my system, but I have some problems in using it,
and the way forward probably involves hacking the code. I will run this
past you all first to get your opinion.



Background:

Our site (http://www.adofms.com.au) is a traditional LAMP application,
using PHP / Apache / MySQL.  Users login to the application, and upon
login, a session is created in the database, and a cookie is set for the
user.

The ADOFMS system contains a large number of Units - Fuel Card -
Vehicles for the users to maintain. When a user logs in and gets a valid
session, they can only see the vehicles and cards associated with their
unit. So far so good.

Problem that I have is that the session identification is done entirely
by the cookie - I do not repeat the session ID in the URL.

So for example -

User number 1 visits :
http://www.adofms.com.au/vehicles.php   - and gets a list of vehicles
that they own.

User number 2 visits
http://www.adofms.com.au/vehicles.php - and they get a different list of
vehicles to what user 1 sees.

So, of course, with Varnish, the vehicles.php output from user 1 is
cached, and presented to user 2. This is very quick and efficient, but
not what we want. I need things to be cached on a session by session basis.


I believe I have 3 options here :

1) Re-write the whole PHP application to repeat the session ID as part
of every URL in the system. That is do-able, but boring.

2) Cook up some VCL code to cache pages on a per-session basis, by
appending the req.http.Cookie value to the URL before it is stored in
the cache, and then doing the same thing when looking up the cache. VCL
does not easily allow this to happen though ???? Correct me if I am wrong.

3) Hack the source code of Varnish to use the session ID (from the
cookie) to segregate cached results by session.


I am going to have a go at method 3) anyway, but would like your opinion
before starting out on this adventure  :)   I would think its not too
hard, since I know exactly what I am trying to achieve, which is often
half the battle when coding. I have some similar enhancements that would
suit my application well. I will explain them here:

Example for extra enchancement :

I have a URL such as

http://www.adofms.com.au/vehicles.php?op=view&id=12345
  - Displays the full details of vehicle ID 12345, which can generate a
lot of SQL calls to create. I would love to cache the results of this on
a per user basis.

If the user updates the vehicle - the naming conventions in this
application guarantee that the backend receives a HTTP POST request with
a URL of :
http://www.adofms.com.au/vehicles.php?op=update .. followed by a call to
redisplay the record, which in this case is
http://www.adofms.com.au/vehicles.php?op=view&id=12345&refresh=1

Now - If I am going to hack the Varnish code anyway, I can get around
this by intercepting POST requests that have an op=update GET variable
set, and an id=<some value> POST variable set .. and if so, remove the
existing vehicles.php?op=view&id=<some value>   entry from the cache.

Again, running this idea past you for feedback. I understand that such a
change would be very specific to our application and the way it works,
but thats OK with me.

Another alternative would be to make VCL a little more powerful - a
couple of simple ways of changing the key value for the "obj" variable
would go a long way I think .. and the ability to grab GET and POST
variables would be very handy too.


Would appreciate your thoughts on these issues.

Thank you
Steve OConnor
ADOFMS Chief Developer




More information about the varnish-misc mailing list