-- Саша Стаменковић <[email protected]> wrote
(on Friday, 24 July 2009, 03:20 PM +0200):
> Wow, great, now it's faster. Thanks Matthew.
> 
> Isn't automatic_serialization true by default in Zend_Cache?

It might be, I'm not sure. Check the API docs. :)

> Why isn't this implemented in Zend_XmlRpc_Server_Cache?

Because it predates the Zend_Server_Definition. It needs to be
refactored.


> On Fri, Jul 24, 2009 at 2:21 PM, Matthew Weier O'Phinney <[email protected]>
> wrote:
> 
>     -- umpirsky <[email protected]> wrote
>     (on Thursday, 23 July 2009, 12:32 AM -0700):
>     > I have XML-RPC client-server architecture witl Zend_XmlRpc on both,
>     client
>     > and server side. My app with XML-RPC is 3-5 times slower with XML-RPC
>     > comparing to same app with pure PHP calls - pretty slow, huh. Some
>     methods
>     > produce very large XML so I needed to page results in some cases and 
> send
>     in
>     > chunks. I attach only one server class with near 100 methods.
>     >
>     > I tried to optimize it with caching server definition like on
>     > http://framework.zend.com/manual/en/zend.xmlrpc.server.html#
>     zend.xmlrpc.server.use.case7
>     > , but it turned out I got even slower calls then without cache. Any idea
>     > why?
>     >
>     > I gained some speed by setting _skipSystemLookup to true. Do you think
>     there
>     > can be some consequences? If I pass empty array for ex?
>     >
>     > Any general tips or idea how I can speed up my server?
> 
>     This is a known problem, actually, and is due to how PHP handles
>     reflection.
> 
>     There is a way around it that's more performant, but not documented. In
>     1.7, we created Zend_Server_Definition, which is simply a value object
>     containing the class => method mappings used by the various servers.
>     Since it's a value object, it does not rely on reflection, and as a
>     result, when autoloading is on, can be a ton more performant.
> 
>     Instead of following the directions currently in the manual, do the
>     following:
> 
>      * Use autoloading. This will ensure you don't have to load all classes
>        attached to the server on every request
>      * Cache the return value of getDispatchTable(). This caches a
>        Zend_Server_Definition, which is a value object with simply string
>        names for the classes and methods (not callbacks or reflection)
>      * On subsequent requests, pass the cached dispatch table to
>        loadFunctions().
> 
>     It might look like this, then:
> 
>        require_once 'Zend/Loader/Autoloader.php';
>        Zend_Loader_Autoloader::getInstance();
> 
>        $server = new Zend_XmlRpc_Server();
> 
>        // Fill in your own front/back-end options. Just make sure that
>        // autoserialization is on.
>        $cache = Zend_Cache::factory('Core', 'File', $frontendOpts,
>     $backendOpts);
> 
>        if (!$definition = $cache->load('xmlrpc-dispatch-table')) {
>            // Do your server definition here...
>            // ...
>            // and then cache the dispatch table
>            $cache->save($server->getDispatchTable(), 'xmlrpc-dispatch-table');
>        } else {
>            // Otherwise, load the server definition
>            $server->loadFunctions($definition);
>        }
> 
>        echo $server->handle();
> 
>     I haven't tested the above, but there *are* unit tests for passing
>     Zend_Server_Definition to loadFunctions(), so the theory has some basis.
>     :)
> 
>     --
>     Matthew Weier O'Phinney
>     Project Lead            | [email protected]
>     Zend Framework          | http://framework.zend.com/
> 
> 

-- 
Matthew Weier O'Phinney
Project Lead            | [email protected]
Zend Framework          | http://framework.zend.com/

Reply via email to