This SOAP server can handle following functions :
<?php
error_reporting
(E_ALL);

ini_set('soap.wsdl_cache_enabled'0);

// to build the elapsedTime parameter
function get_microtime(){
    
$T explode(' 'microtime());
    
$time $T[1].substr($T[0], 1);
    return (float)
$time;
}
define('START_TIME'get_microtime());

class 
WebService {

    private 
$wiki;
    private 
$User '';
    private 
$Password '';
    private 
$MysqlHost '';
    private 
$Base '';
    
    
// SoapServer::setclass() does not take care of the unified constructor __construct() :
    // http://bugs.php.net/bug.php?id=27838
    /*
    function __construct() {        
    }
    */
    
    /**
    * @return 
    * @desc Constructor
    * @comment Database connection & more
    * @comment Rename __construct() when bug 27838 is fixed
    */    
    
function WebService() {
        
        include_once 
'./include/db.conf.php';
        
$this->MysqlHost $HOST;
        
$this->User      $USER;
        
$this->Password  $PASSWORD;
        
$this->Base      $BASE;
        
        if(!@
mysql_connect($this->Host$this->User$this->Password)) {
            return new 
SoapFault('DB''Unable to connect to database server');
            
        }
        if(!@
mysql_select_db($this->Base)) {
            return new 
SoapFault('DB''Unable to select the database');
        }
        
        include_once 
'./include/class.wiki2xhtml.php';
        
$this->wiki = new wiki2xhtml();
    }
    
    
/**
    * @return void
    * @param int $start Start Index
    * @param int $limit Number Results
    * @desc get the last news
    */
    
function getLastNews($start$limit) {
        
        if(!
is_int($limit) || $limit == 0) {
            return new 
SoapFault('Parameter' 'Wrong data type for limit : Integer >= 0 expected');
        }
        
$Query 'SELECT 
        title, 
        content, 
        datetime , 
        DATE_FORMAT(datetime, "%Y.%m.%d.%H.%i.%s") D, 
        auteur 
        FROM classes_blog 
        WHERE hidden = "non" 
        ORDER BY datetime DESC 
        LIMIT '
.(int)$start.','.$limit.'';
        
        if(!
$Result = @mysql_query($Query)) {
            return new 
SoapFault('DB''SQL error : ' mysql_error());
        }
        
        
$Q 'SELECT COUNT(*) C FROM classes_blog';
        
$R mysql_query($Q);
        
$C mysql_fetch_object($R);
        
        while(
$O = @mysql_fetch_object($Result)) {
            
$T[] = array(
            
'title' => utf8_encode($O->title), 
            
'summary' => ''
            
'pubDate' => $O->datetime
            
'URL' => 'http://classes.scriptsphp.net/blog.'.$O->D
            
'content' => utf8_encode($this->wiki->transform($O->content)));
        }
        
        return array(
        
'title' => '--CSP --WS Last News'
        
'description' => 'Last News from Classes.ScriptsPHP.net ',
        
'totalResultsCount' => $C->C,
        
'resultElements' => $T,
        
'startIndex' => $start,
        
'endIndex' => $start+$limit,
        
'elapsedTime' => 0.0
        
);
    }
    
    
/**
    * @return void
    * @param sting $name Class name
    * @desc Get a specific class
    * @comment $name is  case insensitive
    */
    
function getClass($name) {

        
$Query 'SELECT 
        title, 
        LOWER(title) as Ltitle  
        FROM classes_classes'
;
        
        if(!
$Result = @mysql_query($Query)) {
            return new 
SoapFault('DB''SQL error : ' . @mysql_error());
        }
        
        while(
$O mysql_fetch_object($Result)) {
            
$T[$O->Ltitle] = $O->title;
        }
        
        if(!isset(
$T[strtolower($name)])) {
            return new 
SoapFault('Class''Class '.$name.' doesn\'t exist !');
        } else {
            
$class $T[strtolower($name)];
        }
        
        if(!
$OO = @simplexml_load_file('http://classes.scriptsphp.net/source/'.$class.'/'.$class.'.xml')) {
            return new 
SoapFault('XML''Failed to load XML file');
        }
        
        
$Arr = array();
        foreach(
$OO->Methods as $v) {
            
$ArrCode = array();
            foreach(
$v->Code as $vc) {
                
$ArrCode[] = array('value'=> utf8_encode((string)$vc));
            }
            
            
$ArrParameters = array();
            
$i=0;
            foreach(
$v->Params as $vp) {
                
// to update :: 
                
$ArrParameters[] = array('value'=> utf8_encode($v->Params[$i]['name']. ' :: ' .(string)$vp));
                
$i++;
            }
            
            
$Arr[] = array(
            
'title' => (string)utf8_encode($v->Func_name),
            
'description' => (string)utf8_encode($this->wiki->transform($v->Desc)),
            
'URL' => 'http://classes.scriptsphp.net/doc.'.$class.'',
            
'code' => $ArrCode,
            
'parameters' => $ArrParameters
            
);
                
        }

        return array(
        
'title' => 'Classe '.$class
        
'URL' => '',
        
'description' => $OO->Short_desc.' :: '.$this->wiki->transform($OO->Long_desc), 
        
'version' => $OO->Class_version,
        
'author' => $OO->Class_auteur,
        
'lastModified' => $OO->Class_last_modified,
        
'methods' => $Arr
        
'elapsedTime' => get_microtime() - START_TIME
        
        
);
    }
    
    function 
searchScript($search) {
        
/*
        $Query = 'SELECT title,
                summary,
                longdesc,
                MATCH (title,summary,longdesc) AGAINST ("'.mysql_escape_string($search).'") as pertinence 
                FROM classes_classes WHERE 
                MATCH (title,summary,longdesc) AGAINST ("'.mysql_escape_string($search).'") ';
        //$Query = 'SELECT title,summary,longdesc FROM classes_classes WHERE title LIKE "%'.$search.'%" ';
        */
        // **************************************************************************
        
require_once ('./include/class.cspsearch.php');
        
$S = new CspSearch;
        if(!
$R $S->ClassSearch($search)) {
            return new 
SoapFault('SEARCH''Search error');
        }
        foreach(
$R as $result) {
            
$T[] = array (
                
'title' => $result['title'],
                
'url' => 'http://classes.scriptsphp.net/doc.'.$result['title'],
                
'summary' => utf8_encode($result['summary'])
            );
        }
        
//print_r($T);
        
        
        // ***************************************************************************
        /*
        if(!$Result = @mysql_query($Query)) {
            return new SoapFault('DB', 'SQL error : ' . @mysql_error());
        }
        $T = array();
        while($O = mysql_fetch_object($Result)) {
            $T[] = array (
                'title' => $O->title,
                'url' => 'http://classes.scriptsphp.net/doc.'.$O->title,
                'summary' => utf8_encode($O->summary)
            );
            
        }
        */
        
return array(
                
'results' => $T
                
);
    }
    
    
    function 
getClassList($sort) {
    }
    
    function 
getArticle($name) {
        
    }
    function 
getArticleList($sort) {
        
    }

// End class



// -----------------------------------------------------------------------------------------------------------


$server = new SoapServer('ws/csp.wsdl',  array('trace' => 1'soap_version' => SOAP_1_1));

$server->setclass('WebService');

if (
$_SERVER['REQUEST_METHOD'] == 'POST') {
    
$server->handle();
} else {
    echo 
'<strong>This SOAP server can handle following functions : </strong>';    
    echo 
'<ul>';
    foreach(
$server->getFunctions() as $func) {        
        echo 
'<li>',$func,'</li>';
    }
    echo 
'</ul>';
}


if(
strstr($_SERVER['QUERY_STRING'], 'source')) {    
    echo 
'<hr/>';
    
show_source('ws/soapserver.php');
}

?>