Re: application-wide shared data/object

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



http://eaccelerator.net/HomeUk Will keep scripts cached in memory etc. Maybe this is along the lines of what you are looking for.

Aiguo Fei wrote:

Thanks your insightful comments. Clearly scalability is a concern for large
scale applications. One has to be discreet with it if such a facility is
available. For the dictionary example, I feel it definitely can use such a
facility and DB approach is much slower; and scalability/load balancing is
not an issue since no synchronization of any kind is necessary.

I checked APC, but unfortunately it doesn't have any documentation; there is
a short section on it in "Essential PHP Tools", but appears to be too out of
date. I checked out the chapter on PHP extentions in "Power PHP5
programming" book, seems "persistent resource that can survive in between
requests" seems to do what I have in mind, but again there is no more than
just mentioning it.

a.f.

"Rasmus Lerdorf" <rasmus@xxxxxxxxxxx> wrote in message
news:42E87651.1050102@xxxxxxxxxxxxxx
This is the sort of thing we call a scalability killer.  Loading
everything into memory on one machine and then adding locks presumably
for writing to this memory means you are limiting any sort of horizontal
scalability and you are slowing down the one machine you do have with
lock contention.

But yes, there are a number of ways to do this.  PHP has all the
low-level functions you need to create, access and lock shared memory
segments.  If you look at pecl/apc you can use the apc_store/apc_fetch
calls to shove an entire array or object into shared memory just once at
the beginning and then pull it out very quickly directly from memory on
each request.

Or you could write yourself a simple extension that creates the
appropriate structures in memory in the MINIT hook.

But, consider scalability issues.  If you are at the point where you are
looking at concepts like this, you are probably also at the point where
you need to start thinking about horizontal scaling, load balancers,
failover, etc.  A replicated database backend with a replicated copy of
the data on each web server gets you data distribution and robust
locking on the write to the master while all the reads from the local
clients are likely to come right out of the database's memory-based
request cache.  The performance hit for this extra data replication and
scalability is probably smaller than you think and the added value is
extensive.

-Rasmus

Joe Wollard wrote:
Aiguo,


To achieve good performance, I want to load the
whole dictionary into memory  when the "application" starts (e.g.,
when
the web server starts...
I'm not sure how ASP works, but in PHP you can't load something into
memory when the web server starts and keep it there. PHP 'compiles'
each script upon request and then frees up the memory it occupied.  I'd
think that this would be counter productive if your looking to  achieve
good performance because you'll be re-building the dictionary  on every
page load.


It might be better to let another application load the data into  memory
and hold it there instead of making PHP load the whole thing  every time
a user requests the page/data. If it were me I think I'd  simply load
the dictionary into a database and build a simple library  or class to
perform queries and calculations against the dictionary.

Assuming your class definition takes care of connecting to the  database
server you could lookup a word in almost the exact way you
demonstrated.
e.g.
$dict = new dictionary;
$definition = $dict->lookup($word);


If you'll need this object to be available on every page the user  sees
you could always make a 'common.php' (or whatever) which would  create
the object and then include that at the top of each page.


For a complete solution, it should support object locking/exclusive
access as well.
Maybe I've been a spoiled PHP programmer for too long. ;-) I'm not  sure
what object locking/ exclusive access is but from the sounds of  it,
there isn't a way to do this in PHP that I'm aware of. This is  assuming
that you want to be able to basically remove the object from  the global
scope. In PHP objects are globally accessible from the  moment they're
created to the moment they're destroyed.

Good luck!
-Joe


On Jul 27, 2005, at 8:40 PM, Aiguo Fei wrote:

In ASP.Net there is the concept of "application" which is a virtual
directory on a Web server. An application can have application-wide
shared data/objects, which can be accessed by any script of that
application (i.e., scripts under the virtual directory). I have gone
through several PHP books, haven't seen it mentioned anywhere that PHP
has similar facility. I don't know if anyone has written an extention
to do something similar. Or any experience/suggestion on this matter.

To make it clear, consider the following example. I want to do
web-based dictionary. To achieve good performance, I want to load the
whole dictionary into memory when the "application" starts (e.g., when
the web server starts, or triggered when the first script under a
certain directory is requested), and build a lookup table; then create
a globally-accessible object, let's say, Application["my_dict"]; and
it provides a function to do the dictionary lookup. In a script, one
could do something like:
$definition=Application["my_dict"]->lookup( $word );

For a complete solution, it should support object locking/exclusive
access as well.

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





[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux