[PHP] Cache engines in a multi-tenant environment (a bit long)

2009-03-03 Thread Damon Miller
Hi all.  I need some guidance on implementing a PHP cache engine in a
multi-tenant environment.  I've done some research on the open-source
cache engines available--specifically, APC, XCache, and
eAccelerator--but I haven't found anything that speaks to my use case.
Hopefully someone will be able to point me in the right direction.


Here's the basic use case:  I've got multiple instances of one PHP
application running on a single server.  This is accomplished in a
fairly straightforward manner:  We just create multiple copies of the
application on the filesystem.  It looks something like this:

/var/www/html/abc
/var/www/html/def
/var/www/html/ghi

Etc.


Each of the directories above ('abc', 'def', and 'ghi') contains a
complete copy of the PHP applicationwith slight variations based on
customer need.  Examples of these differences are LDAP parameters,
layout customizations, field names, etc.  Note that these variations
often occur in the PHP code, i.e. there will be multiple occurrences of
file ldap.php 


This works without incident but due to increasing adoption, performance
has become an issue.  In an attempt to improve performance, I
implemented APC.  This resulted in a significant performance gain, but
after several days we noticed intermittent problems that clearly
indicated one instance's code was being leaked to another instance.
As a specific example, we began seeing one customner's layout changes in
another instance.  These were quite obvious in that a field bearing the
wrong company name suddenly appeared.


After ruling out obvious filesystem mistakes I was forced to conclude
that the cache engine was serving the wrong version of a file.  I
enclose that in quotes because APC may technically doing the right
thing; given multiple copies of the same source file--as would
frequently occur in our environment--it cached the latest one and served
it up as requested.  However, this behavior is not compatible with our
hosting approach.


My question then becomes the following:  Is there a cache engine
available which can store multiple (different) copies of a source file
and serve them only to the appropriate request?  Perhaps a better way to
describe this would be a sort of mapping feature allowing
per-directory control.  I'm imagining a simple list of directories that
instructs the cache engine to keep their caches separate.  This might
even be implemented by incorporating the directory name into the key
used for lookups, but frankly I haven't spent much time looking at APC's
code (nor have I looked at XCache's or eAccelerator's at all.)


Thanks in advance for any guidance.



Regards,

Damon

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



RE: [PHP] Cache engines in a multi-tenant environment (a bit long)

2009-03-03 Thread Damon Miller
On Tue, 2009-03-03 at 14:52 -0500, Robert Cummings wrote:
 
  My question then becomes the following:  Is there a cache engine
  available which can store multiple (different) copies of a source
file
  and serve them only to the appropriate request?  Perhaps a better
way
  to describe this would be a sort of mapping feature allowing
  per-directory control.  I'm imagining a simple list of directories
  that instructs the cache engine to keep their caches separate.  This
might
  even be implemented by incorporating the directory name into the key
  used for lookups, but frankly I haven't spent much time looking at
  APC's code (nor have I looked at XCache's or eAccelerator's at all.)
 
 If the path to the source file differs then it shouldn't matter that
the
 source tree is a copy, for all intents and purposes, as far as an
 accelerator is concerned, the sources are different. I've not liked
APC
 in the past (I don't remember exactly what the problem was) and
 personally use eAccelerator.
 
 Cheers,
 Rob.

Rob,

Thanks very much for your response.  I was surprised at APC's behavior
(thinking that files in different directories would be treated as
different entities) but I couldn't explain the behavior I was seeing
otherwise.  However, that may be a function of APC specifically and not
all PHP cache engines.  I'll spend some time with eAccelerator and
hopefully it will work as expected.

Thanks again,

Damon


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php