Re: apc and cli

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

 



On Wed, December 12, 2007 1:33 pm, Ravi Menon wrote:
> We have long running daemons written in php ( cli, non-apache
> contexts) with the typical pattern:
>
> while( !$shutdown )
> {
>     $c = new SomeClass;
>
>     $c->process();
> }
>
> For performance reasons, would it help if apc.enable_cli is turned on:
>
>   apc.enable_cli  integer
>
>     Mostly for testing and debugging. Setting this enables APC for the
> CLI version of PHP. Normally you wouldn't want to create, populate and
> tear down the APC cache on every CLI request, but for various test
> scenarios it is handy to be able to enable APC for the CLI version of
> APC easily.
>
>
> I am slightly confused by the statement - 'Mostly for testing and
> debugging.....' .
>
> On each loop iteration, does php recompile the code in 'SomeClass' (
> and all its dependencies ) or it is really cached ( as it has seen the
> class code once ).
>
> If there is a php internals document on such issues, do let me know.

The following is almost-for-sure correct, but I wouldn't swear in
court...

Step 0. Read PHP/HTML source code.
Step 1. PHP uses a 2-pass compiler and generates byte-code.
Step 2. The byte-code is then feed to the executer.
Step 3. Executer spews output (or crashes or whatever)

APC and other caches add a Step 1A., which stores the byte-code in RAM
under the filename (or full path, depending on config) as a key.

Therefore, adding APC will not affect in any way the "while" loop --
It's compiled once in Step 1, and that's it.

If you re-run the same script again and again, however, APC in CLI
might be able to keep the script around and avoid a hit to the disk to
LOAD the script (Step 0 above) as well as avoiding the 2-pass
compilation to byte-code (Step 1 above).

NOTE:
Step 0 is the REALLY expensive step where APC et al are REALLY
boosting performance.

APC et al *could* just insert step 0A and store the PHP source, and
have ALMOST the same benefits.

However, storing the compiled version at Step 1A gets you some free
gravy in not re-compiling the PHP source to byte-code, so they do that
because, well, it's essentially FREE and saves a few more cpu cycles.

But the REAL boost, again, is from not hammering the hard drive (slow)
to load PHP source into RAM, Step 0.

PS
If you are really concerned about the constructor of SomeClass being
expensive, time it and see.

YOU may be doing something incredibly expensive there like
re-connecting to the database (slow!) each time.

You may also not even NEED a whole new SomeClass every time -- Perhaps
you could just make a singleton and then reset its values and call
process() with the new values instead of building up a whole new
instance each time.

-- 
Some people have a "gift" link here.
Know what I want?
I want you to buy a CD from some indie artist.
http://cdbaby.com/from/lynch
Yeah, I get a buck. So?

-- 
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