Автор работы: Пользователь скрыл имя, 12 Января 2014 в 22:01, курсовая работа
Распределенным называется приложение, отдельные компоненты которого работают на разных компьютерах и используют разные сетевые средства, но взаимодействуют так, что приложение выглядит как единое целое, как будто все его компоненты расположены на одной машине. Простейшая архитектура распределенного приложения, называемая архитектурой клиент-сервер, предполагает, что приложение состоит из двух частей: серверной части, оказывающей услуги, и клиентской части, пользующейся услугой.
Синтаксис PHP подобен
синтаксису языка Си. Некоторые элементы,
такие как ассоциативные
Для работы программы не
требуется описывать какие-либо
переменные, используемые модули и
т. п. Любая программа может
Фрагмент кода, реализующего простейшую программу на PHP, приведен ниже.
<?php
echo 'Hello, world!';
?>
PHP исполняет
код, находящийся внутри
PHP является
языком программирования с
К скалярным типам данных относятся:
- целый тип (integer),
- вещественный тип данных (float, double),
- логический тип (boolean),
- строковый тип (string),
- специальный тип NULL.
К нескалярным типам относятся:
- «ресурс» (resource),
- массив (array),
- объект (object),
Существует несколько реализаций поддержки протокола SOAP в PHP, среди них стоит отметить Pear SOAP, NuSOAP, eZ SOAP. В данном проекте будет использована нативная реализация поддержки SOAP в PHP, использующая стандартные классы SoapClient() и SoapServer().
2.4 Язык WSDL
В ряде случаев после создания Web-службы ее состав и возможности следует описать, после чего описание зарегистрировать в реестре Web-служб (например, UDDI) или сохранить на сервере Web-службы.
Для описания Web-служб в настоящее время используется язык WSDL. WSDL поддерживает консорциум W3C. WSDL — еще одна реализация XML.
Корневым элементом документа XML — описания WSDL — служит элемент <definitions>. В этом элементе необязательным атрибутом name можно дать имя описанию.
Кроме того, в нем размещаются используемых в описании пространства имен (например, xsd, xsi).
Пространство имен документа WSDL обычно получает префикс tns (target namespace), идентификатор которого определяется атрибутом targetNamespace.
В корневой элемент <definitions> вкладываются элементы шести основных и двух дополнительных типов.
Все элементы необязательны, их может быть любое количество, за исключением элемента <types>, который может встретиться в документе только один раз. У каждого элемента есть имя, определяемое обязательным атрибутом name. Элементы ссылаются друг на друга с помощью этих имен.
Элементы, вкладываемые в корневой элемент <definitions>:
- <types> — определяет сложные типы, используемые Web-службой, с помощью языка XSD. Этот элемент не нужен, если Web-служба применяет только простые типы, описанные в языке XSD.
- <message> — описывает каждое SOAP-послание: запрос, ответ, пересылку документов. В этот элемент вкладываются элементы <part>, описывающие неделимые с точки зрения WSDL части послания.
- <portType> — описывает интерфейс Web-службы, называемый в языке WSDL пунктом назначения (endpoint) или портом (port) прибытия послания. Он описывается как набор Web-услуг, называемых в языке WSDL операциями.
Операции описываются вложенными элементами <operation>, описывающими каждую отдельную услугу. Услуга описывается действиями, которые разбиты на четыре вида:
1) "получение послания",
2) "отправка ответа",
3) "отправка послания — получение ответа"
4) "получение послания — отправка ответа".
Получение и отправка, в свою очередь, описываются вложенными элементами <input> и <output>, а сообщение об ошибке — элементом <fauit>.
- <serviceType> — перечисляет вложенными элементами <portType> набор портов, связанных с одной Web-службой. Один и тот же порт может быть связан с несколькими службами.
- <binding> — описывает конкретный формат пересылки послания: протоколы, такие как SOAP или HTTP, способы упаковки послания, тип его содержимого: HTML, XML или другой MIME-тип послания.
- <service> — указывает местоположение Web-службы как один или несколько портов. Каждый порт описывается вложенным элементом <port>, содержащим адрес интерфейса Web-службы.
Для создания SOAP Web-службы на PHP прежде всего необходимо провести установку и настройку PHP, а также локального HTTP-сервера. В данном проекте был использован пакет XAMP, позволяющий провести быструю установку HTTP-сервера Apache и PHP.
Отдельно необходимо внести правки в конфигурационные файлы Apache и PHP.
В конфигурационном файле HTTP-сервера Apache httpd.conf необходимо найти приведенный ниже фрагмент кода.
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Satisfy all
</Directory>
Далее необходимо закомментировать строку “Deny from all”, с помощью символа #.
Для запуска PHP-скриптов на локальном сервере необходимо хранить их в корневой директории сервера Apache, по умолчанию, папка htdocs в корневой папке Apache. Для изменения корневой директории сайта необходимо внести изменения в файл httpd.conf в строку, приведенную ниже.
DocumentRoot "Apache_home/htdocs"
Для подключения поддержки PHP в файл httpd.conf необходимо внести следующие строки.
AddType Application/x-httpd-php .php
LoadModule php5_module "php_home/sapi/php5apache2_2.
Для запуска HTTP-сервера Apache можно использовать консольные команды, либо контрольную панель XAMMP, позволяющую управлять состоянием Apache, ф также проводить его конфигурацию.
Вид данной утилиты приведен на рисунке 3.1.
Рисунок 3.1 Утилита XAMMP Control Panel
Для создания SOAP Web-службы необходимо написать PHP документы, реализующие клиентскую и серверную стороны приложения, а также WSDL-страницу, для описания Web-сервиса.
Создадим Web-службу, которая предоставляет одну Web-услугу, возвращающую клиенту результат выполнения арифметической операции над двумя числами. Входными элементами являются два числа, задаваемые клиентом, а также символьная переменная, определяющая арифметическую операцию.
Клиентская
сторона реализована двумя PHP-
Фрагмент кода, реализующий файл form.php, приведен ниже.
<form method="post" action="code.php">
Number 1 <input type="text" name="a" />
Operation <input type="text" name="action" />
Number 2 <input type="text" name="b" />
<input type="submit" name="submit" value="Calculate"/>
</form>
В файле code.php создается экземпляр класса клиента и происходит получение введенных пользователем данных и их отсылка в SOAP послании серверу.
Фрагмент кода, реализующий создание экземпляра класса клиента приведен ниже.
$client = new SoapClient("calc.wsdl");
В данном фрагменте создается экземпляр $client класса SoapClient, выполняющий SOAP-послание в соответствие с конфигурационным файлом cacl.wsdl.[6]
В файле code.php также выполняется присвоение переменным $a, $b, $action значений членов ассоциативного массива $_POST, хранящего полученные из form.php данные. Фрагмент кода, реализующий данные операции приведен ниже.
$a = $_POST['a'];
$b = $_POST['b'];
$action = $_POST['action'];
Далее выполняется запрос к серверу, содержащий значения переменных $a, $b, $action.
$response = $client->getCalcEntry($a,$b,$
Где getCalcEntry() – описанная в WSDL-файле операция, а также функция в серверной части.
В данной Web-службе роль серверной части играет файл calc-server.php. В данном файле происходит объявление и вызов функции getCalcEntry. Данная функция проверяет значение переменной $action, и в соответствии с ним выполняет операцию над переменными $a и $b, записывая результат в переменную $c. Фрагмент кода, реализующий данную функцию, приведен ниже.
function getCalcEntry($a,$b,$action) {
if ($action === "+") {$c = $a+$b; }
if ($action === "-") {$c = $a-$b; }
if ($action === "*") {$c = $a*$b; }
if ($action === "/") {
if ($b === 0) $c = “Divide by 0”
else $c = $a/$b; }
return $c;
}
Далее выполняется создание экземпляра класса SOAP-сервера.
$server = new SoapServer("calc.wsdl");
$server->addFunction("
$server->handle();
В данном фрагменте метод addFunction() предоставляет доступ к функции getCalcentry удаленному клиенту. Метод handle() выполянет обработку SOAP-запроса, вызов необходимых функций и посылку SOAP-ответа.
Важную роль в работе данной SOAP Web-службы играет файл описания calc.wsdl. В данном файле определены основные параметры SOAP-посланий. Фрагмент кода, отвечающий за реализацию этого, приведен ниже.
<message name='getCalcRequest'>
<part name='a' type='xsd:string'/>
<part name='b' type='xsd:string'/>
<part name='action' type='xsd:string'/>
</message>
<message name='getCalcResponse'>
<part name='Result' type='xsd:string'/>
</message>
В данном фрагменте элементы <message> getCalcRequest и getCalcResponse – SOAP-запрос и SOAP-ответ соответственно. В вложенных в <message> элементах определены имена передаваемых переменных и их типы.
Следует заметить, что возможна передача строк (тип string), которые будут преобразованы в числа неявно, благодаря динамической типизации в PHP.
Также важным элементом WSDL-файла является описание интерфейса Web-службы, выполняемое элементом <portType>.
Фрагмент кода, описывающий интерфейс Web-службы, приведен ниже.
<portType name='CalcPortType'>
<operation name='getCalcEntry'>
<input message='tns:getCalcRequest'/>
<output message='tns:getCalcResponse'/
</operation>
</portType>
В данном фрагменте элемент <operation> описывает конкретную услугу getCalcEntry, состоящую из двух действий. Первое действие getCalcRequest представляет собой отправку послания, второе действие getCalcResponse – получение ответа.
Для успешной работы Web-сервиса на локальном сервере необходимо:
> http://localhost/PhpProject3/
Результат показан на рисунке 3.2.
Рисунок 3.2 – Форма ввода данных
Рисунок 3.3 – Результат работы Web-службы
Для того, чтобы более подробно рассмотреть работу SOAP, модифицируем код файла code.php таким образом, что в браузер вместе с результатом вычисления будут выводиться листинги последних SOAP-посланий – запроса и ответа.
Рисунок 3.4 – Результат работы модифицированной Web-службы
Фрагмент кода, выполняющий данные функции приведен ниже.
print "<pre>\n";
print "Request:\n".htmlspecialchars
($client->__getLastRequest()) ."\n";
print "Response:\n".htmlspecialchars
($client->__getLastResponse())
print "</pre>";
Данный фрагмент содержит стандартные системные методы класса SoapClient __getLastRequest() и getLastResponse(), возвращающие текст SOAP-посланий.
При рассмотрении полученных таким образом SOAP-посланий, явно виден обмен данными между клиентом и сервером. В случае запроса данные содержатся в приведенном ниже фрагменте кода.
<SOAP-ENV:Body>
<ns1:getCalcEntry>
<a xsi:type="xsd:string">5</a>
<b xsi:type="xsd:string">3</b>
<action xsi:type="xsd:string">-</
</ns1:getCalcEntry>
</SOAP-ENV:Body>
Данный фрагмент содержит тело SOAP-конверта, в которое вложен элемент <ns1:getCalcEntry>, описывающий Web-услугу. В него вложены элементы, хранящие значения передаваемых переменных и их типы данных. Серверу передаются значения чисел 5 и 3, а также символ выполняемой над ними операции вычитания.