<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>heig.de &#187; persistent</title>
	<atom:link href="http://heig.de/tag/persistent/feed/" rel="self" type="application/rss+xml" />
	<link>http://heig.de</link>
	<description>digital life by Gregor Kulikowski</description>
	<lastBuildDate>Mon, 26 Apr 2010 19:31:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP-WebService mittels SOAP &#8211; Tutorial</title>
		<link>http://heig.de/2009/03/php-webservice-mittels-soap-tutoria/</link>
		<comments>http://heig.de/2009/03/php-webservice-mittels-soap-tutoria/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 23:40:27 +0000</pubDate>
		<dc:creator>gk</dc:creator>
				<category><![CDATA[.tutorials]]></category>
		<category><![CDATA[persistent]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Webservice]]></category>
		<category><![CDATA[WSDL]]></category>

		<guid isPermaLink="false">http://heig.de/?p=72</guid>
		<description><![CDATA[Dieses Tutorial beschreibt, wie man mit PHP in kürzester Zeit einen SOAP WebService erstellt, der mit Persistenz umgehen kann und WSDL-Dateien selber generiert.
Wenn es in PHP-Projekten um Client-Server-Kommunikation, ins Besondere um RPC, geht, lässt man sich schnell dazu verleiten &#8220;mal eben&#8221; was eigenes zu bauen, obwohl es doch einige Standards für RPC gibt. Viele &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p><span style="text-decoration: underline;">Dieses <em>Tutorial </em>beschreibt, wie man mit <em>PHP </em>in kürzester Zeit einen <em>SOAP WebService </em>erstellt, der mit <em>Persistenz</em> umgehen kann und <em>WSDL</em>-Dateien selber generiert.</span></p>
<p>Wenn es in PHP-Projekten um Client-Server-Kommunikation, ins Besondere um <a title="Wikipedia - RemoteProcedureCall" href="http://de.wikipedia.org/wiki/Remote_Procedure_Call">RPC</a>, geht, lässt man sich schnell dazu verleiten &#8220;mal eben&#8221; was eigenes zu bauen, obwohl es doch einige Standards für <a title="Wikipedia - RemoteProcedureCall" href="http://de.wikipedia.org/wiki/Remote_Procedure_Call">RPC</a> gibt. Viele &#8211; genau wie ich auch &#8211; scheuen den Aufwand sich in Monster wie <a title="Wikipedia - SOAP" href="http://de.wikipedia.org/wiki/SOAP" target="_blank">SOAP</a> oder das etwas schlankere <a title="Wikipedia - XML-RPC" href="http://de.wikipedia.org/wiki/XML-RPC" target="_blank">XML-RPC</a> einzuarbeiten. Mit den richtigen Tool&#8217;s jedoch können PHP-Klassen jedoch mit geringstem Mehraufwand über <a title="Wikipedia - SOAP" href="http://de.wikipedia.org/wiki/SOAP" target="_blank">SOAP</a> zugänglich gemacht werden.</p>
<p><span id="more-72"></span></p>
<div id="attachment_79" class="wp-caption alignright" style="width: 160px"><a rel="lightbox" href="http://heig.de/wp-content/uploads/phpinfo_soap_screenshot.jpg"><img class="size-thumbnail wp-image-79" title="phpinfo_soap_screenshot" src="http://heig.de/wp-content/uploads/phpinfo_soap_screenshot-150x150.jpg" alt="PHP mit aktiviertem SOAP" width="150" height="150" /></a><p class="wp-caption-text">PHP mit aktiviertem SOAP</p></div>
<p>Die Einzige Vorraussetzung ist einen Webserver mit PHP5.0.3 oder aktueller und aktiviertem <a title="PHP: SOAP - Munual" href="http://de3.php.net/manual/de/book.soap.php" target="_blank">SOAP</a>.</p>
<p>Leider ist die native SOAP-Implementation von PHP jedoch relativ kryptisch und bietet momentan keine Möglichkeit <a title="Wikipedia - WSDL" href="http://de.wikipedia.org/wiki/Web_Services_Description_Language" target="_blank">WSDL</a> Dateien zu generieren.  Die <strong>W</strong>eb <strong>S</strong>ervices <strong>D</strong>escription <strong>L</strong>anguage ist eine plattform-, programmiersprachen- und protokollunabhängige Beschreibungssprache für Netzwerkdienste (Web Services) zum Austausch von Nachrichten auf Basis von XML. Über diese WSDL-Dateien können dann Client-Stubs, z.B. in .NET komplett generiert werden.</p>
<p>Abhilfe schafft da der <a title="PHP Webservice Helper" href="http://www.jool.nl/new/1,webservice_helper.html" target="_blank">Webservice-Helper</a> [nachfolgend WSH genannt] von <a title="jool.nl" href="http://jool.nl" target="_blank">jool.nl</a>. Der WSH nimmt einem jegliche Arbeit ab, um Klassen und Objekte über SOAP bereitzustellen.Zusätzlich generiert der WSH automatisch WSDL-Dateien. Diese WSDL&#8217;s können dann, wie gesagt zum generieren von Clients in beliebigen Sprachen benutzt werden.</p>
<p>Also den WSH <a title="Download-Seite" href="http://www.jool.nl/new/2,download.html" target="_blank">herunterladen</a> und entpacken. Standardmäßig kann der WSH auf Klassen zugreifen die in den folgenden Unterordnern liegen:</p>
<ul>
<li>lib/data_objects/<span style="color: #888888;"><em>Klassenname</em>.class.php</span></li>
<li>lib/soap/<span style="color: #888888;"><em>Klassenname</em>.class.php</span></li>
<li>lib/<span style="color: #888888;"><em>Klassenname</em>.class.php</span></li>
</ul>
<p>Der Dateiname muss sich aus dem Klassennamen und &#8220;.class.php&#8221; zusammensetzten. Es ist jedoch auch möglich, Klassen aus anderen Ordnern bereitzusetellen. Dazu muss die Autoload-Funktion in der <em>common.php</em> angepasst  werden.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/** autoload functie voor PHP5 */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> __autoload<span class="br0">&#40;</span><span class="re0">$classname</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><a href="http://www.php.net/file_exists"><span class="kw3">file_exists</span></a><span class="br0">&#40;</span><span class="st0">&quot;lib/data_objects/$classname.class.php&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&quot;lib/data_objects/$classname.class.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elseif</span><span class="br0">&#40;</span><a href="http://www.php.net/file_exists"><span class="kw3">file_exists</span></a><span class="br0">&#40;</span><span class="st0">&quot;lib/soap/$classname.class.php&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&quot;lib/soap/$classname.class.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elseif</span><span class="br0">&#40;</span><a href="http://www.php.net/file_exists"><span class="kw3">file_exists</span></a><span class="br0">&#40;</span><span class="st0">&quot;lib/$classname.class.php&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span><span class="br0">&#40;</span><span class="st0">&quot;lib/$classname.class.php&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Die dort definierten Suchpfade und auch Dateinamen (.class.php) können nach belieben geändert werden. Ist der Zugriff konfiguriert, müssen die Klassen noch in der <em>config.php</em> freigegeben werden.</p>
<p><strong>config.php</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/* All the allowed webservice classes */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$WSClasses</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;BeispielKlasse&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;TestKlasse&quot;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;Klasse&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/* The classmap associative array. When you want to allow objects as a parameter for</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* your webservice method. ie. saveObject($object). By default $object will now be</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp;* a stdClass, but when you add a classname defined in the type description in the @param</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* documentation tag and add your class to the classmap below, the object will be of the</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* given type. Requires PHP 5.0.3+</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$WSStructures</span> = <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;TestDatentyp&quot;</span> =&gt; <span class="st0">&quot;TestDatentyp&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Alle Klassen, die über SOAP betreitgestellt werden sollen müssen im Array <em>$WSClasses</em> aufgeführt werden. Damit wird sichergestellt, dass über die autoload Funktion keine ungewollten Dateien aufgerufen werden. Objekte bzw. strukturierte Datentypen, die als Paramer oder Rückgabewert einer Funktion genutzt werden, sollten noch im Array <em>$WSStructures</em> aufgeführt werden, damit man einen typisierten Austausch dieser Daten realisieren kann.</p>
<p>Typisierte Daten in PHP?! Ja genau. Damit die ganze Geschichte funktioniert muss der PHP Code Dokumentiert/Typisiert werden. Die Syntax der Dokumentation ist analog der von <a title="The compolete documentation soulution for php" href="http://www.phpdoc.org/" target="_blank">phpDocumentor</a>, jedoch wird nur ein Teil der Schlüsselwörter benutzt. Jeder Parameter und der Rückgabewert einer Methode muss Typisiert werden. Das geschieht durch die Schlüsselwörter @param und @return um Doc-Block (/**  */). Dazu ein kleines Beispiel:</p>
<p><strong>BeispielKlasse.class.php</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * Beispiel einer Dokumentierten Klasse</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> BeispielKlasse<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Funktion mit mehreren Parametern und ohne Rückgabewerte</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Aufbau: @return datentyp|void</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Aufbau: @param datentyp $parametername Beschreibung</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @return void</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param sting $text Ein übergebener String</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param int $number Ein Integer</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @param boolean $something Ein boolean-Wahrheitswert</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> foo<span class="br0">&#40;</span><span class="re0">$text</span>, <span class="re0">$number</span>, <span class="re0">$something</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * Funktion mit einfachem Rückgabewert</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * @return string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span>&nbsp;helloWorld<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;Hallo Welt&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * Funktion die ein Array eines komplexen Datentyps zurückgibt</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; * @return TestDatentyp[]</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">function</span> helloWorld<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$objects</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="kw2">new</span> TestDatentyp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$objects</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="kw2">new</span> TestDatentyp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$objects</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="kw2">new</span> TestDatentyp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$objects</span><span class="br0">&#91;</span><span class="br0">&#93;</span> = <span class="kw2">new</span> TestDatentyp<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$objects</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Natürlich muss der genutzte Datentyp <span class="st0">&quot;TestDatentyp&quot;</span> auch definiert und ebenfalls typisiert werden:</div>
</li>
</ol>
</div>
<p><strong>TestDatentyp.class.php</strong></p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; * Beispiel eines strukturierten Datentyps mit zwei Attributen.</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; */</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> TestDatentyp<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Name einer Person</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @var string</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re0">$name</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Alter einer Person</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @var int</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re0">$age</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li2">
<div class="de2"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Geschlecht einer Person</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @var boolean</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re0">$gender</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="coMULTI">/**</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* Name einer Person</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;* @var string</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="re0">$name</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//&#8230;weitere, auch strukturierte Attribute / Funktionen möglich</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">?&gt;</span></div>
</li>
</ol>
</div>
<p>Sind alle Klassen geschrieben ist der WebService fertig. Denn der WSH sorgt nun dafür, dass alle Methoden, die public sind, über SOAP bereit gestellt werden. Die passende WSDL zum WebService gibts automatisch dazu. Unter folgendem Pfad kann man die WDSL beziehen:</p>
<pre>http://deinserver/service.php?class=<em>BeispielKlasse</em>&amp;wsdl</pre>
<p>Mit dieser WSDL-Datei kann man nun auf einfachste Weise Client-Stubs generieren. Ein Tutorial dazu werde ich die Tage mal verfassen.</p>
<p>Bei der Arbeit mit diesem PHP WebService wird man auf zwei größere Hürden stoßen:</p>
<ol>
<li> Persistenz</li>
<li>Codeänderungen</li>
</ol>
<p>Zu 1: Die PHP-SOAP-Engine kennt zwei Persistenz-Modi: <em>SOAP_PERSISTENCE_SESSION</em> und <em>SOAP_PERSISTENCE_REQUEST. </em>Der <em>SOAP_PERSISTENCE_SESSION-</em>Modus ist der schönere von beiden <img src='http://heig.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , PHP-Objekte werden mit all Ihren Attributen in einer Session gespeichert und sind somit über mehrere Aufrufe persistent. Da PHP Cookies nutzt um die Session-ID an den Client zu übermitteln, muss sichergestellt sein, dass der SOAP-Client dies auch unterstützt.<br />
Der <em>SOAP_PERSISTENCE_REQUEST</em>-Modus hingegen deaktiviert die Persistenz und versetzt den WebService in den Amnesie-Modus <img src='http://heig.de/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
Leider ist die Persistenz im WSH standardmäßig deaktiviert. Um die szu ändern muss folgende Codezeile in der service.php ersetzt werden:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$WSHelper</span>-&gt;<span class="me1">setPersistence</span><span class="br0">&#40;</span>SOAP_PERSISTENCE_REQUEST<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>ersetzten durch</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$WSHelper</span>-&gt;<span class="me1">setPersistence</span><span class="br0">&#40;</span>SOAP_PERSISTENCE_SESSION<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Zu 2: Damit die ganze WebService Sache einigermaßen performant bleibt, arbeiten sowohl der WSH alsauch die nativen PHP-Methoden mit Caches. Damit äußere Strukturänderungen an den über SOAP bereitgestellten Klassen angewandt werdem müssen der WSDL-Cache und der PHP-Cache gelöscht werden. Die WSDL-Dateien befinden sich im Unterordner <em>&#8216;wsdl&#8217;</em> vom WSH. Bei geändertem Code einfach alle Datien löschen, damit diese neu generiert werden können. Dazu sollte man noch den WSDL-Cache von PHP löschen. Dieser befindet sich im tmp-Ordner des Servers (/tmp). Alle Dateien die mit <em>&#8216;wsdl-&#8217;</em> beginnen löschen &#8211; dann klappts auch mit den Änderungen</p>
<p>In diesem Sinne, viel Erfolg. Fragen bitte als Kommentar posten!</p>
]]></content:encoded>
			<wfw:commentRss>http://heig.de/2009/03/php-webservice-mittels-soap-tutoria/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

