2
0

Zend_XmlRpc_Server.xml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17520 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.xmlrpc.server">
  5. <title>Zend_XmlRpc_Server</title>
  6. <sect2 id="zend.xmlrpc.server.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. <classname>Zend_XmlRpc_Server</classname> ist als vollständiger
  10. <acronym>XML-RPC</acronym> Server geplant, der den <ulink
  11. url="http://www.xmlrpc.com/spec">Spezifikationen auf www.xmlrpc.com</ulink> folgt.
  12. Des Weiteren implementiert er die Methode <command>system.multicall()</command>, welche
  13. dem Entwickler erlaubt, mehrere Anfragen aufzureihen.
  14. </para>
  15. </sect2>
  16. <sect2 id="zend.xmlrpc.server.usage">
  17. <title>Grundlegende Benutzung</title>
  18. <para>
  19. Ein Beispiel der grundlegendsten Benutzung:
  20. </para>
  21. <programlisting language="php"><![CDATA[
  22. $server = new Zend_XmlRpc_Server();
  23. $server->setClass('My_Service_Class');
  24. echo $server->handle();
  25. ]]></programlisting>
  26. </sect2>
  27. <sect2 id="zend.xmlrpc.server.structure">
  28. <title>Server-Struktur</title>
  29. <para>
  30. <classname>Zend_XmlRpc_Server</classname> ist aus einer Vielfalt von Komponenten
  31. zusammengesetzt, die vom Server selbst über Anfrage-, Antwort- und bis hin zu
  32. Fehler-Objekten reicht.
  33. </para>
  34. <para>
  35. Um den <classname>Zend_XmlRpc_Server</classname> zu erstellen, muss der Entwickler dem
  36. Server eine oder mehrere Klassen oder Funktionen durch die Methoden
  37. <methodname>setClass()</methodname> und <methodname>addFunction()</methodname>
  38. hinzufügen.
  39. </para>
  40. <para>
  41. Wenn dieses erstmal erledigt wurde, kann man entweder der Methode
  42. <methodname>Zend_XmlRpc_Server::handle()</methodname> ein
  43. <classname>Zend_XmlRpc_Request</classname>-Objekt übergeben oder es wird ein
  44. <classname>Zend_XmlRpc_Request_Http</classname> instanziert, falls keines angegeben
  45. wurde - die Anfrage wird also aus <filename>php://input</filename> geladen.
  46. </para>
  47. <para>
  48. <methodname>Zend_XmlRpc_Server::handle()</methodname> versucht daraufhin, den
  49. zuständigen Handler, der durch die angeforderte Methode bestimmt wird,
  50. auszuführen. Es wird entweder ein <classname>Zend_XmlRpc_Response</classname>-
  51. oder ein <classname>Zend_XmlRpc_Server_Fault</classname>-Objekt zurückgegeben.
  52. Beide Objekte besitzen eine Methode <methodname>__toString()</methodname>, die eine
  53. gültige <acronym>XML-RPC</acronym> Antwort im <acronym>XML</acronym>-Format zurückgibt,
  54. die direkt ausgegeben werden kann.
  55. </para>
  56. </sect2>
  57. <sect2 id="zend.xmlrpc.server.conventions">
  58. <title>Konventionen</title>
  59. <para>
  60. <classname>Zend_XmlRpc_Server</classname> ermöglicht es dem Entwickler, Funktionen und
  61. Methodenaufrufe als ausführbare <acronym>XML-RPC</acronym> Methoden anzufügen. Durch
  62. <classname>Zend_Server_Reflection</classname> wird die Überwachung aller angefügten
  63. Methoden - durch Nutzung der DocBlocks der Methoden und Funktionen
  64. werden deren Hilfstexte und Signaturen ermittelt - ermöglicht.
  65. </para>
  66. <para>
  67. <acronym>XML-RPC</acronym> Typen werden nicht zwingend 1:1 zu <acronym>PHP</acronym>
  68. Typen konvertiert. Dennoch wird versucht, einen passenden Typ, anhand der in
  69. @param- und @return-Zeilen enthaltenen Werte, zu ermitteln. Einige
  70. <acronym>XML-RPC</acronym> Typen besitzen jedoch kein direktes Äquivalent und sollten
  71. deshalb mittels <acronym>PHP</acronym>doc auf einen <acronym>XML-RPC</acronym> Typen
  72. hinweisen. Diese beinhalten:
  73. </para>
  74. <itemizedlist>
  75. <listitem>
  76. <para>
  77. <emphasis><property>dateTime.iso8601</property></emphasis>, ein String, der das
  78. Format YYYYMMDDTHH:mm:ss besitzt
  79. </para>
  80. </listitem>
  81. <listitem><para><emphasis>base64</emphasis>, base64-kodierte Daten</para></listitem>
  82. <listitem><para>struct, jegliches assoziatives Array</para></listitem>
  83. </itemizedlist>
  84. <para>
  85. 'Anbei ein Beispiel für einen solchen Hinweis:
  86. </para>
  87. <programlisting language="php"><![CDATA[
  88. /**
  89. * Dies ist eine Beispielfunktion.
  90. *
  91. * @param base64 $val1 Base64-kodierte Daten
  92. * @param dateTime.iso8601 $val2 Ein ISO-Datum
  93. * @param struct $val3 ein assoziatives Array
  94. * @return struct
  95. */
  96. function myFunc($val1, $val2, $val3)
  97. {
  98. }
  99. ]]></programlisting>
  100. <para>
  101. PhpDocumentor validiert keine Typen, die in Parameter- oder
  102. Rückgabewerten angegeben sind, weshalb dies keinen Einfluss auf
  103. die <acronym>API</acronym> Dokumentation hat. Das Angeben der Hinweise ist notwendig,
  104. da der Server die, dem Methodenaufruf zugewiesenen, Parameter
  105. validiert.
  106. </para>
  107. <para>
  108. Es ist genauso gut möglich, mehrere Werte als Parameter oder für
  109. die Rückgabe anzugeben; die <acronym>XML-RPC</acronym> Spezifikation schlägt sogar
  110. vor, dass system.methodeSignatur ein Array, das alle möglichen
  111. Methodensignaturen (d.h. jegliche Kombination aus Parametern und
  112. Rückgabewerten) enthält, zurückgibt. Um dies zu erreichen, kann
  113. man, wie man es normalerweise auch beim PhpDocumentor auch tun würde,
  114. einfach den '|'-Operator nutzen.
  115. </para>
  116. <programlisting language="php"><![CDATA[
  117. /**
  118. * Dies ist eine Beispiel-Funktion.
  119. *
  120. * @param string|base64 $val1 String oder base64-kodierte Daten
  121. * @param string|dateTime.iso8601 $val2 String oder ein ISO-Datum
  122. * @param array|struct $val3 Normal indiziertes oder assoziatives Array
  123. * @return boolean|struct
  124. */
  125. function myFunc($val1, $val2, $val3)
  126. {
  127. }
  128. ]]></programlisting>
  129. <para>
  130. Dennoch eine Anmerkung: Das Erlaubung von vielen Signaturen kann
  131. zu Verwirrung für Entwickler führen, wenn Sie diese Services nutzen;
  132. man sollte einer <acronym>XML-RPC</acronym> Methode deshalb nur eine Signatur zuweisen.
  133. </para>
  134. </sect2>
  135. <sect2 id="zend.xmlrpc.server.namespaces">
  136. <title>Nutzen von Namensräumen</title>
  137. <para>
  138. <acronym>XML-RPC</acronym> besitzt ein Konzept für Namensräume; Grundlegend erlaubt es
  139. das Gruppieren von <acronym>XML-RPC</acronym> Methoden durch Punkt-separierte
  140. Namensräume. Dies hilft, Namenkollisionen zwischen Methoden, die durch verschiedene
  141. Klassen offeriert werden, zu verhindern. Beispielsweise kann der
  142. <acronym>XML-RPC</acronym> Server mehrere Methoden im 'system'-Namensraum nutzen:
  143. </para>
  144. <itemizedlist>
  145. <listitem><para>system.listMethods</para></listitem>
  146. <listitem><para>system.methodHelp</para></listitem>
  147. <listitem><para>system.methodSignature</para></listitem>
  148. </itemizedlist>
  149. <para>
  150. Intern werden die Methoden zu Methoden desselben Namens in der
  151. Klasse <classname>Zend_XmlRpc_Server</classname> umgeleitet.
  152. </para>
  153. <para>
  154. Um angebotenen Methoden Namensräume hinzuzufügen, muss man lediglich beim
  155. Hinzufügen der gewünschten Klasse oder Funktion einen Namensraum angeben:
  156. </para>
  157. <programlisting language="php"><![CDATA[
  158. // Alle öffentlichten Methoden in My_Service_Class sind als
  159. // myservice.METHODNAME verfügbar
  160. $server->setClass('My_Service_Class', 'myservice');
  161. // Funktion 'somefunc' ist als funcs.somefunc ansprechbar.
  162. $server->addFunction('somefunc', 'funcs');
  163. ]]></programlisting>
  164. </sect2>
  165. <sect2 id="zend.xmlrpc.server.request">
  166. <title>Eigene Request-Objekte</title>
  167. <para>
  168. Die meiste Zeit wird man einfach den Standard-Anfragetyp
  169. <classname>Zend_XmlRpc_Request_Http</classname>, welcher im
  170. <classname>Zend_XmlRpc_Server</classname> enthalten ist, nutzen. Jedoch gibt es
  171. gelegentlich Fälle, in denen <acronym>XML-RPC</acronym> über die Kommandozeile
  172. (<acronym>CLI</acronym>), ein grafisches Benutzerinterface (<acronym>GUI</acronym>),
  173. eine andere Umgebung oder beim Protokollieren von ankommenden Anfragen erreichbar sein
  174. muss. Um dies zu bewerkstelligen, muss man ein eigenes Anfrage-Objekt kreieren, das
  175. <classname>Zend_XmlRpc_Request</classname> erweitert. Die wichtigste Sache, die man
  176. sich merken muss, ist sicherzustellen, dass die Methoden
  177. <methodname>getMethod()</methodname> und <methodname>getParams()</methodname>
  178. implementiert sind, so dass der <acronym>XML-RPC</acronym> Server Informationen erhält,
  179. die er für das Abfertigen einer Anfrage benötigt.
  180. </para>
  181. </sect2>
  182. <sect2 id="zend.xmlrpc.server.response">
  183. <title>Eigene Antwort-Objekte</title>
  184. <para>
  185. Ähnlich wie bei den Anfrage-Objekten, kann der <classname>Zend_XmlRpc_Server</classname>
  186. auch eigene Antwortobjekte ausliefern; standardmäßig ist dies ein
  187. <classname>Zend_XmlRpc_Response_Http-Objekt</classname>, das einen passenden
  188. Content-Type <acronym>HTTP</acronym>-Header sendet, der für <acronym>XML-RPC</acronym>
  189. genutzt wird. Mögliche Nutzungen eines eigenen Objekts sind z.B. das Protokollieren von
  190. Antworten oder das Senden der Antworten zu <constant>STDOUT</constant>.
  191. </para>
  192. <para>
  193. Um eine eigene Antwortklasse zu nutzen, muss
  194. <methodname>Zend_XmlRpc_Server::setResponseClass()</methodname> vor dem Aufruf von
  195. <methodname>handle()</methodname> aufgerufen werden.
  196. </para>
  197. </sect2>
  198. <sect2 id="zend.xmlrpc.server.fault">
  199. <title>Verarbeiten von Exceptions durch Fehler</title>
  200. <para>
  201. <classname>Zend_XmlRpc_Server</classname> fängt die, durch eine ausgeführte Methode
  202. erzeugten, Exceptions and generiert daraus einen <acronym>XML-RPC</acronym> Fehler als
  203. Antwort, wenn eine Exception gefangen wurde. Normalerweise werden die
  204. Exceptionnachrichten und -codes nicht in der Fehler-Antwort genutzt. Dies ist eine
  205. gewollte Entscheidung um den Code zu schützen; viele Exceptions entblößen mehr
  206. Informationen über den Code oder die Umgebung als der Entwickler
  207. wünscht (ein Paradebeispiel beinhaltet Datenbankabstraktion- oder
  208. die Zugriffsschichten-Exceptions).
  209. </para>
  210. <para>
  211. Exception-Klassen können jedoch anhand einer Weißliste (Whitelist) als
  212. Fehler-Antworten zurückgegeben werden. Dazu muss man lediglich die gewünschte
  213. Exception mittels
  214. <methodname>Zend_XmlRpc_Server_Fault::attachFaultException()</methodname> zur
  215. Weißliste hinzufügen:
  216. </para>
  217. <programlisting language="php"><![CDATA[
  218. Zend_XmlRpc_Server_Fault::attachFaultException('My_Project_Exception');
  219. ]]></programlisting>
  220. <para>
  221. Abgeleitete Exceptions lassen sich als ganze Familie von Exceptions
  222. hinzufügen, indem man deren Basisklasse angibt.
  223. <classname>Zend_XmlRpc_Server_Exception</classname>'s sind immer auf der Weißliste zu
  224. finden, da sie spezielle Serverfehler berichten (undefinierte Methoden, etc.).
  225. </para>
  226. <para>
  227. Jede Exception, die nicht auf der Weißliste zu finden ist, generiert
  228. eine Antwort mit dem '404' Code und der Nachricht 'Unknown error'.
  229. </para>
  230. </sect2>
  231. <sect2 id="zend.xmlrpc.server.caching">
  232. <title>Zwischenspeichern von Serverdefinitionen zwischen den Anfragen</title>
  233. <para>
  234. Das Hinzufügen einer Vielzahl von Klassen zu einer <acronym>XML-RPC</acronym> Server
  235. Instanz kann zu einem großen Ressourcenverbrauch führen; jede Klasse muss via Reflection
  236. <acronym>API</acronym> (<classname>Zend_Server_Reflection</classname>) inspiziert
  237. werden, welche eine Liste von allen möglichen Signaturen, die der Server verwenden kann,
  238. zurückgibt.
  239. </para>
  240. <para>
  241. Um die Einbußen zu reduzieren, kann <classname>Zend_XmlRpc_Server_Cache</classname>
  242. genutzt werden, welche die Serverdefinitionen zwischen den Anfragen zwischenspeichert.
  243. Wenn dies mit <methodname>__autoload()</methodname> kombiniert wird, kann es zu einem
  244. großen Geschwindigkeitsschub kommen.
  245. </para>
  246. <para>
  247. Ein Beispiel folgt:
  248. </para>
  249. <programlisting language="php"><![CDATA[
  250. function __autoload($class)
  251. {
  252. Zend_Loader::loadClass($class);
  253. }
  254. $cacheFile = dirname(__FILE__) . '/xmlrpc.cache';
  255. $server = new Zend_XmlRpc_Server();
  256. if (!Zend_XmlRpc_Server_Cache::get($cacheFile, $server)) {
  257. require_once 'My/Services/Glue.php';
  258. require_once 'My/Services/Paste.php';
  259. require_once 'My/Services/Tape.php';
  260. $server->setClass('My_Services_Glue', 'glue'); // glue. Namensraum
  261. $server->setClass('My_Services_Paste', 'paste'); // paste. Namensraum
  262. $server->setClass('My_Services_Tape', 'tape'); // tape. Namensraum
  263. Zend_XmlRpc_Server_Cache::save($cacheFile, $server);
  264. }
  265. echo $server->handle();
  266. ]]></programlisting>
  267. <para>
  268. Obiges Beispiel zeigt, wie der Server versucht, eine Definition
  269. aus der Datei <property>xmlrpc.cache</property>, welches sich im selben Ordner wie das
  270. Skript befindet, zu laden. Wenn dies nicht erfolgreich ist,
  271. lädt es die Server-Klassen, die es benötigt, und fügt sie zum
  272. Server hinzu. Danach wird versucht, die Cache-Datei mit der
  273. Serverdefinition zu erstellen.
  274. </para>
  275. </sect2>
  276. <sect2 id="zend.xmlrpc.server.use">
  277. <title>Nutzungsbeispiele</title>
  278. <para>
  279. Unten finden sich etliche Beispiele für eine Nutzung, die das
  280. gesamte Spektrum der verfügbaren Optionen für den Entwickler darstellen.
  281. These Beispiele bauen immer auf den vorangegangenen Beispielen auf.
  282. </para>
  283. <sect3 id="zend.xmlrpc.server.use.case1">
  284. <title>Grundlegende Benutzung</title>
  285. <para>
  286. Folgendes Beispiel fügt eine Funktion als ausführbare
  287. <acronym>XML-RPC</acronym> Methode hinzu und verarbeitet eingehende Aufrufe.
  288. </para>
  289. <programlisting language="php"><![CDATA[
  290. /**
  291. * Gibt die MD5-Summe eines Strings zurück.
  292. *
  293. * @param string $value Wert aus dem die MD5-Summe errechnet wird
  294. * @return string MD5-Summe des Werts
  295. */
  296. function md5Value($value)
  297. {
  298. return md5($value);
  299. }
  300. $server = new Zend_XmlRpc_Server();
  301. $server->addFunction('md5Value');
  302. echo $server->handle();
  303. ]]></programlisting>
  304. </sect3>
  305. <sect3 id="zend.xmlrpc.server.use.case2">
  306. <title>Hinzufügen einer Klasse</title>
  307. <para>
  308. Das nächste Beispiel illustriert, wie man die öffentlichen Methoden
  309. eienr Klasse als ausführbare <acronym>XML-RPC</acronym> Methoden hinzufügt.
  310. </para>
  311. <programlisting language="php"><![CDATA[
  312. $server = new Zend_XmlRpc_Server();
  313. $server->setClass('Services_Comb');
  314. echo $server->handle();
  315. ]]></programlisting>
  316. </sect3>
  317. <sect3 id="zend.xmlrpc.server.use.case3">
  318. <title>Mehrere Klassen unter der Nutzung von Namensräumen hinzufügen</title>
  319. <para>
  320. Das nächste Beispiel zeigt, wie man mehrer Klassen mit ihren eigenen
  321. Namensräumen hinzufügt.
  322. </para>
  323. <programlisting language="php"><![CDATA[
  324. require_once 'Services/Comb.php';
  325. require_once 'Services/Brush.php';
  326. require_once 'Services/Pick.php';
  327. $server = new Zend_XmlRpc_Server();
  328. // Methoden werden als comb.* aufgerufen
  329. $server->setClass('Services_Comb', 'comb');
  330. // Methoden werden als brush.* aufgerufen
  331. $server->setClass('Services_Brush', 'brush');
  332. // Methoden werden als pick.* aufgerufen
  333. $server->setClass('Services_Pick', 'pick');
  334. echo $server->handle();
  335. ]]></programlisting>
  336. </sect3>
  337. <sect3 id="zend.xmlrpc.server.use.case4">
  338. <title>Bestimmen von Exceptions als valide Fehler-Antwort</title>
  339. <para>
  340. Im nächsten Beispiel wird gezeigt, wie man jede Exception, die von
  341. <classname>Services_Exception</classname> abgeleitet wurde, als Fehler-Antwort
  342. nutzen kann, dessen Nachricht und Code erhalten bleibt.
  343. </para>
  344. <programlisting language="php"><![CDATA[
  345. require_once 'Services/Exception.php';
  346. require_once 'Services/Comb.php';
  347. require_once 'Services/Brush.php';
  348. require_once 'Services/Pick.php';
  349. // Services_Exceptions dürfen als Fehler-Antwort genutzt werden
  350. Zend_XmlRpc_Server_Fault::attachFaultException('Services_Exception');
  351. $server = new Zend_XmlRpc_Server();
  352. // Methoden werden als comb.* aufgerufen
  353. $server->setClass('Services_Comb', 'comb');
  354. // Methoden werden als brush.* aufgerufen
  355. $server->setClass('Services_Brush', 'brush');
  356. // Methoden werden als pick.* aufgerufen
  357. $server->setClass('Services_Pick', 'pick');
  358. echo $server->handle();
  359. ]]></programlisting>
  360. </sect3>
  361. <sect3 id="zend.xmlrpc.server.use.case5">
  362. <title>Nutzen eines eigenen Anfrage-Objekts</title>
  363. <para>
  364. Im folgenden Beispiel wird ein eigenes Anfrage-Objekt instanziert
  365. und durch den Server verarbeitet.
  366. </para>
  367. <programlisting language="php"><![CDATA[
  368. require_once 'Services/Request.php';
  369. require_once 'Services/Exception.php';
  370. require_once 'Services/Comb.php';
  371. require_once 'Services/Brush.php';
  372. require_once 'Services/Pick.php';
  373. // Services_Exceptions dürfen als Fehler-Antwort genutzt werden
  374. Zend_XmlRpc_Server_Fault::attachFaultException('Services_Exception');
  375. $server = new Zend_XmlRpc_Server();
  376. // Methoden werden als comb.* aufgerufen
  377. $server->setClass('Services_Comb', 'comb');
  378. // Methoden werden als brush.* aufgerufen
  379. $server->setClass('Services_Brush', 'brush');
  380. // Methoden werden als pick.* aufgerufen
  381. $server->setClass('Services_Pick', 'pick');
  382. // Ein neues Anfrage-Objekt wird erstellt
  383. $request = new Services_Request();
  384. echo $server->handle($request);
  385. ]]></programlisting>
  386. </sect3>
  387. <sect3 id="zend.xmlrpc.server.use.case6">
  388. <title>Nutzen eigener Antwort-Objekte</title>
  389. <para>
  390. Das nachstehende Beispiel zeigt, wie man eine eigene Antwort-Klasse
  391. als zurückgegebene Antwort für den Server setzt.
  392. </para>
  393. <programlisting language="php"><![CDATA[
  394. require_once 'Services/Request.php';
  395. require_once 'Services/Response.php';
  396. require_once 'Services/Exception.php';
  397. require_once 'Services/Comb.php';
  398. require_once 'Services/Brush.php';
  399. require_once 'Services/Pick.php';
  400. // Services_Exceptions dürfen als Fehler-Antwort genutzt werden
  401. Zend_XmlRpc_Server_Fault::attachFaultException('Services_Exception');
  402. $server = new Zend_XmlRpc_Server();
  403. // Methoden werden als comb.* aufgerufen
  404. $server->setClass('Services_Comb', 'comb');
  405. // Methoden werden als brush.* aufgerufen
  406. $server->setClass('Services_Brush', 'brush');
  407. // Methoden werden als pick.* aufgerufen
  408. $server->setClass('Services_Pick', 'pick');
  409. // Ein neues Anfrage-Objekt wird erstellt
  410. $request = new Services_Request();
  411. // Nutzen eigener Antwort-Klasse
  412. $server->setResponseClass('Services_Response');
  413. echo $server->handle($request);
  414. ]]></programlisting>
  415. </sect3>
  416. <sect3 id="zend.xmlrpc.server.use.case7">
  417. <title>Zwischenspeichern von Serverdefinition zwischen den Anfragen</title>
  418. <para>
  419. Dieses Beispiel zeigt, wie man Serverdefinitionen zwischen verschiedenen
  420. Anfragen zwischenspeichern kann.
  421. </para>
  422. <programlisting language="php"><![CDATA[
  423. // Definieren einer Cache-Datei
  424. $cacheFile = dirname(__FILE__) . '/xmlrpc.cache';
  425. // Services_Exceptions dürfen als Fehler-Antwort genutzt werden
  426. Zend_XmlRpc_Server_Fault::attachFaultException('Services_Exception');
  427. $server = new Zend_XmlRpc_Server();
  428. // Versucht die Serverdefinition aus dem Cache zu laden
  429. if (!Zend_XmlRpc_Server_Cache::get($cacheFile, $server)) {
  430. // Methoden werden als comb.* aufgerufen
  431. $server->setClass('Services_Comb', 'comb');
  432. // Methoden werden als brush.* aufgerufen
  433. $server->setClass('Services_Brush', 'brush');
  434. // Methoden werden als pick.* aufgerufen
  435. $server->setClass('Services_Pick', 'pick');
  436. // Speichern des Caches
  437. Zend_XmlRpc_Server_Cache::save($cacheFile, $server);
  438. }
  439. // Ein neues Anfrage-Objekt wird erstellt
  440. $request = new Services_Request();
  441. // Nutzen eigener Antwort-Klasse
  442. $server->setResponseClass('Services_Response');
  443. echo $server->handle($request);
  444. ]]></programlisting>
  445. </sect3>
  446. </sect2>
  447. </sect1>
  448. <!--
  449. vim:se ts=4 sw=4 et:
  450. -->