PHP. Soap service. Remote Procedure Call. Разработка тестового веб-сервиса

Наш тестовый веб-сервис будет решать одну задачу: на любой входной запрос, состоящего из даты в формате - день.месяц.год - он должен возвращать дату в виде timestamp. Создадим для этого процедуру - test(). Итак, для разворачивания soap - сервиса необходимо убедиться в том, что в настройках разрешено использование soap - сервера и клиента

Далее выделяете необходимую директорию для последующих служебных файлов. В моем примере в корне хоста test.ru была выделена директория - /web_service, куда разместил следующие файлы:
.htaccess - поддержка веб - сервиса;
index.php - реализация движка веб - сервиса (класс соединения и вызываемые процедуры);
web_service.wsdl - описание нашего тестового веб - сервиса и доступа к нему;
test.php - для демонстрации работы веб - сервиса.
Ниже приведено их содержимое, думаю по ним не составит труда разобраться.

.htaccess

# Enables or disables WSDL caching feature.
php_flag soap.wsdl_cache_enabled 0

# Sets the directory name where SOAP extension will put cache files.
php_value soap.wsdl_cache_dir "/tmp"

# (time to live) Sets the number of second while cached file will be used
# instead of original one.
php_value soap.wsdl_cache_ttl 0


AddDefaultCharset utf8

index.php

<?php
   
    ini_set('soap.wsdl_cache_enabled', 'Off');
   
    class Connection
    {
        /*
            Возвращает заданную дату в виде timestamp.
            Формат даты - dd.mm.yyyy
        */
        function test($dt) {
       
            if (!empty($dt)) {
                $dt = explode('.', $dt);
                $time_stamp = mktime(0, 0, 0, $dt[1], $dt[0], $dt[2]);
                return $time_stamp;
            }
            else {
                return false;
            }
           
        }   
       
    }
   
    try
    {
        $server = new SoapServer('http://192.168.126.128/web_service/web_service.wsdl?'.rand());
        $server->setClass("Connection");
        $server->handle();
    }
    catch (ExceptionFileNotFound $e)
    {
        echo 'Error message: ' . $e->getMessage();
    }

?>


web_service.wsdl

<?xml version="1.0" encoding="utf-8"?>

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="webserviceService" targetNamespace="http://tempuri.org/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/">

<message name="test_input">
    <part name="dt" type="xs:string"/>
</message>

<message name="test_output">
    <part name="request" type="xs:string"/>
</message>

<message name="null_response"/>

<portType name="Connection">
    <operation name="test">
        <input message="tns:test_input"/>
        <output message="tns:test_output"/>
    </operation>
</portType>

<binding name="bind_connect" type="tns:Connection">

    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>

    <operation name="test">
        <soap:operation soapAction="urn:web-service#test" style="rpc"/>
        <input message="tns:test_input">
            <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:web-service"/>
        </input>
        <output message="tns:test_output">
            <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:web-service"/>
        </output>
    </operation>

</binding>

<service name="webserviceService">
    <port name="webservicePort" binding="tns:bind_connect">
        <soap:address location="http://
192.168.126.128/web_service/index.php"/>
    </port>
</service>

</definitions>


test.php

<?php

header('Content-type: text/html; charset=utf-8');
@set_time_limit(300);

try {
   
    $client = new SoapClient("http://192.168.126.128/web_service/web_service.wsdl?".rand(), 

                                                     array('trace' => 1, 'exceptions' => 1));
    echo 'test('.date("d.m.Y", time()).') = '.$client->test(strval(date("d.m.Y", time())));
   
}
catch (SoapFault $e) {

    echo "<pre>".print_r($e, true)."</pre>";
    echo "<br/><br/>Error Caught";

}

?>


Стоит отметить, что при инстанцировании soap-сервера и клиентов, а также в файле описания веб-сервиса, был использован ip-адрес веб-сервера, также можно использовать и непосредственное имя хоста (test.ru).
После завершения всех работ, пробуем протестировать наш веб-сервис. На запрос

http://test.ru/web_service/test.php

мы получаем ожидаемый ответ

test(27.03.2014) = 1395903600

Что говорит о работоспособности сервиса. Всем успеха. Исходники можно скачать по следующей ссылке - download