Also did some benchmarking on my Macbook (with a SSD and memcached running on localhost):
Checking egw_cache_memcache:
0 checks failed, 100 iterations took 0.480 sec
Checking egw_cache_apc:
0 checks failed, 100 iterations took 0.025 sec
Checking egw_cache_files:
0 checks failed, 100 iterations took 0.826 sec
--> APC is by a factor of 20 faster then memcached, which is double as fast compared to files on a SSD
- changing config in setup did not update or unset the cache --> instance was NOT using it
- new installs failed, because cache was not configured
- cache command to not configured cache gave fatal error, now they throw a (catchable) exception
egw_cache::get_provider(Instance) no provider found (error instanciating provider egw_cache_files: egw_cache_files::__construct() server/temp_dir
--> made egw_cache::get_config_value public, so egw_cache_files can use it and for regular egw sessions read install_id and temp_dir together with system_charset, before calling config::read()
- arrays in $GLOBALS[egw_info][server] are now automatically serialized and unserialized
- new static method to check if user is export-limit excepted
--> saves to query it on each request (for non-phpgwapi, which was already cached in the session)
Used now by default, if function apc_fetch() exists and no
other caching provide is explicitly set in header.inc.php or egw_cache
class.
It's probably quicker on virtual machines, as it uses memory and not the
filesystem.
- cleaned up exceptions in cli code (no need to log, as it goes direct to the user)
- regarding small rpm redirect header (< 200 bytes) as no header
- fixed wrong detected vars for cli install (eg. webserver_url)
- fixed egw_cache to not stall if system_charset is not yet in db
- caching the phrases in new egw_cache on Tree level
--> a good speed improvment on my devel system
- also added a global function
check_load_extension($extension,$throw=false)
It allows to cache on 4 levels:
a) tree: for all instances/domains runining on a certain source path
b) instance: for all sessions on a given instance
c) session: for all requests of a session, same as egw_session::appsession()
d) request: just for this request (same as using a static variable)
There's a get, a set and a unset method for each level: eg. getTree()
or setInstance(), as well as a variant allowing to specify the level as first
parameter: eg. unsetCache()
getXXX($app,$location,$callback=null,array $callback_params,$expiration=0)
has three optional parameters allowing to specify:
3. a callback if requested data is not yes stored. In that case the
callback is called and it's value is stored in the cache AND retured
4. parameters to pass to the callback as array, see call_user_func_array
5. an expiration time in seconds to specify how long data should be cached,
default 0 means infinit (this time is not garantied and not
supported for all levels!)
Data is stored under an application name and a location, like
egw_session::appsession().
In fact data stored at cache level egw_cache::SESSION, is stored in
the same way as egw_session::appsession() so both methods can be used
with each other.
The $app parameter should be either the app or the class name, which
both are unique.
The tree and instance wide cache uses a certain provider class, to
store the data eg. in memcached or if there's nothing else configured
in the filesystem (eGW's temp_dir).