Электронный научный журнал «Век качества» ISSN 2500-1841 http ://www .agequal.ru 2016, № 3 http://www.agequal.ru/pdf/2016/AGE QUALITY 3 2016.pdf Ссылка для цитирования этой статьи:
Воронцов Ю.А., Козинец А.В. Пример построения web-сервиса с использованием Apache и MySQL // Электронный научный журнал «Век качества». 2016. №3. С. 75-101. Режим доступа: http://www.agequal.ru/pdf/2016/316006.pdf (доступ свободный). Загл. с экрана. Яз. рус., англ.
УДК 004.7
Пример построения web-сервиса с использованием Apache и MySQL.
Воронцов Юрий Алексеевич
заведующий кафедрой информационных систем, профессор, доктор технических наук, Московский технический университет связи и информатики 125993, Москва, ул. Народного Ополчения, 32, каб.409а
yvorontsov.1943@mail.ru Козинец Артур Валерьевич заведующий лабораториями кафедры информационных
систем
Московский технический университет связи и информатики 125993, Москва, ул. Народного Ополчения, 32, каб.407
kozinets@mtuci2. ru
Аннотация
В статье рассматривается пример построения web-сервиса. В качестве средств реализации используются скриптовый язык PHP и веб-сервер Apache. Данные хранятся в базе данных, управляемой с помощью MySQL. При построении информационной системы применены средства виртуализации.
Ключевые слова: распределенные информационные системы; веб-сервисы; веб-службы; PHP; Apache; MySQL.
info@agequal.ru
Иногда распределенной информационной системой (РИС) называют такую распределённую систему, в которой функционирует более одного сервера БД. Распределенная информационная система в узком смысле, с позиции программного обеспечения (ПО) - это совокупность программных компонент, взаимодействующих друг с другом. Каждая из таких компонент может рассматриваться как программный модуль (приложение), исполняемый в рамках отдельного процесса. Частным случаем такого приложения являются web-сервисы [1]. Современные распределённые информационные системы рассматриваются как распределенные системы программного обеспечения. Связь между цепочкой взаимодействующих процессов — есть суть распределенных систем.
В статье будет рассмотрено решение следующей задачи. Таблица бензин-цена находится в базе данных на сервере. Администратор производит изменения цены в базе через web-страницу управления БД. Изменения цены в базе автоматически отображаются на HTML странице web-сервера. Клиент работает только в режиме чтения таблицы бензин-цена (HTML страница размещается на сервере). Клиент через браузер заходит на HTML страницу вручную по IP адресу. В качестве подходя при реализации задачи необходимо
Концептуальная модель распределенной информационной системы представлена на рисунке 1.
Рис. 1. Концептуальная модель. Разработано авторами.
Прикладная архитектура информационной системы представлена на рисунке 2. Система состоит из трех компонентов: браузера, размещающегося на рабочих станциях, веб-сервера и сервера базы данных, размещающихся на сервере.
Рис. 2. Прикладная архитектура решения. Разработано авторами.
Реализация инфраструктуры ИС.
При решении многих задачи заниматься построением полноценной физической инфраструктуры не целесообразно из-за больших финансовых расходов [2]. Мы рассмотрим виртуальную инфраструктуру, которая по своему составу будет соответствовать ИС, описанной выше. Системная архитектура решения представлена на рисунке 3.
Виртуальная рабочая станция ws2
Рис. 3. Системная архитектура решения. Разработано авторами.
Виртуализация сервера
На персональном компьютере создаем инфраструктуру ИС. В качестве средства виртуализации [3] будем использовать ПО УкШаШох [4, 5, 6]. Для создания виртуальной ОС щелкните кнопку «Создать». Запустить мастер создания новой виртуальной машины. Следуя его инструкциям нужно будет выбрать семейство будущей виртуальной операционной системы и ее версию, а также, ввести ее имя.
Рис. 4. Создание виртуальной машины [4].
Далее, загрузчик попросит нас указать объем оперативной памяти доступной виртуальной ОС.
Далее нужно будет создать новый жесткий диск, это довольно простая процедура, нужно просто следовать инструкциям мастера создания новых жестких дисков.
После установки необходимо настроить созданную виртуальную машину. Все настройки интуитивно понятны.
На вкладке Носители необходимо выбрать образ Windows Server для ее последующей установки:
Рис. 5. Настройка накопителей [4].
На вкладке Система необходимо выделить память, поставить приоритет загрузки на Жесткий диск, выделить процессоры для гостевой ОС.
Рис. 6. Настройка системы [4].
Для того, чтобы иметь возможность обмена с основной ОС можно подключить Общую папку:
Рис. 7. Общая папка [4].
На вкладке сеть необходимо добавить 2 адаптера: первый для работы с сетью Интернет, второй для соединения между Виртуальными машинами.
Рис. 8. Первый адаптер [4].
Рис. 9. Второй адаптер [4].
Настройка сетевого соединения сервера и рабочей станции.
Для настройки соединения виртуальной машины ws1 и виртуальной машины srv2 необходимо в Virtuaffiox нажать Файл - Настройки - вкладка Сеть. Вводим IP адрес хоста для Виртуальных машин и отключаем DHCP.
Рис. 10. Настройка виртуальной сети хоста. [5].
На виртуальных машинах и необходимо настроить подключение по локальной сети [6] в процессе установки гостевых операционных систем. Детально установка операционной системы описана в статье [2]. Для этого
необходимо задать свойства Протокола интернета TCP/IP. Необходимо выбрать постоянный IP для виртуальной машины из сети хоста, заданной в 1 пункте (Сеть 192.168.192.0, Диапазон возможных значений 192.168.192.2 -192.168.192.254).
Рис. 11. Настройка локальной сети. Разработано авторами.
Настройка завершена. Проверим доступность Виртуальных машин выполнив из командной строки команду ping:
Доступность рабочей станции (192.168.192.22) с сервера, а доступ-ность сервера (192.168.192.21) с рабочей станции:
Офис Работает] - Oracle VM VïrtualBox
сл Командная строка
Microsoft Windows [Версия 5.2.3790] СО Корпорация Майкрософт, 1985-2ШШЗ.
C:\Documents and Settings\AflMHHHCTpaTop>ping 192.168.192.22 Обмен пакетами с 192.J 68.192.22 по с 32 байт данных:
Ответ от 192.168.192.22 Ответ от 192.168.192.22 Ответ от 192.168.192.22 Ответ от 192.168.192.22
число еайт=32 время<1ис TTL=128 число байт=32 время=1мс TTL=128 число байт=32 время=2мс TTL=128 число байт=32 время=1мс ТТЬ=128
Статистика Ping для 192.168.192.22:
Пакетов: отправлено = 4, получено = 4, потеряно = О потерь)
Приблизительное время приема-передачи в мс:
Минимальное = Омсек, Максимальное = 2 мсек, Среднее
1 Филиал [Работает] - Oracle VM Virtual Бах
с\ Командная строка
Microsoft Windows [Версия 5.2.3790] <С> Корпорация Майкрософт, 1985—2003.
C:\Docunents and Settings\flflMHHHcгратор>ping 192.168.192.21 Обмен пакетами с 192.168.192.21 по с 32 байт данных:
Ответ от 192.168.192.21 Ответ от 192.168.192.21 Ответ от 192.168.192.21 Ответ от 192.168.192.21
число байт=32 время=1мс ТТЬ=128
число байт=32 время=1мс ТТЬ=128
число байт=32 время=1мс ТТЬ=128
число байт=32 время=1мс ТТЬ=128
Статистика Fing для 192.168.192.21:
Пакетов: отправлено = 4, получено = 4, потеряно = И (Oü потерь) Приблизительное время приема-передачи в мс:
Минимальное - 1мсек, Максимальное = 1 мсек. Среднее — 1 мсек
Рис. 12. Проверка локальной сети. Разработано авторами.
Доступность каждой рабочей станции по отношению к другой является необходимым условием для обеспечения работоспособности ИС.
Программная реализация
Для создания Web-сервиса нужно установить на компьютер локальный сервер Denwer [7, 8]. Denwer — набор дистрибутивов, которые используются Web-разработчиками для разработки сайтов на локальной Windows-машине без необходимости выхода в Интернет.
1. При первом запуске, инсталлятор спрашивает: «Вы действительно хотите установить базовый пакет?», нажимаем «Да».
2. В приветственном окне нажимаем «Enter», как написано.
Рис. 13. Подтверждение установки [7].
3. После этого указываем папку, куда будет устанавливаться сервер.
Можно оставить по умолчанию «QYWebServers».
* IWif H I '||IHI- ШнЛ.о.- »MhijiM-nu^ С J-^HMÖCHP-:
- Ь'л44а it-iLi! mä wh pi r pnpPTii! iiji а q н iip-ij-п n = С;\WI HDWtN с уь г ^п^Й/орч^. ел»
* 11и<11111и<Н |Р4И 1>И biM*|iii|4 №13! И |11фи*ПР .
* Ültiiwin Fll HCl-lini'- (1ЙМО Tri г 1 ». CHTUHlie npillüKiiriv fl п Ирййре .
' ■♦вч>ь:>0ЛМ1П;Л1 ÜCtl'fl u«'i|'|fcpipi'?l<b*.
■ ji^i •) HTI п I» UJr»ÖiSek£ .
* Lyi !> Г |"U OGliC !Jl5-b l-rtfl l|M,f|l| |4 .
f ilniir'H HIllfrVJtUM PHUX
UfiinMli: пин MifiiH« . «иНфрДО МЫ ¿СНЫГл ¡JL' i Л нDП Ii Г ь Дтмргм-
ЕвЛМ Вы nit: М!>#ИАЫал*«р Qliil*H|| На picJtf ч!«ti ^J, j Г» ЩЯВНВИ BCf i Ü
rl 3 Iii I Ii TdfcL'Gi. Ilpnnn »Mtll ilrtUrlrt Ii НЙМНС1Й« AMT« ftfil I rtlfllDH И (CI 1 PMil * r I U l> н ii > л I' mill ЦДУ'ЩП! ft«H(li№ffi »Iii "MP и n if п Uli г r »i " И Ф IfHTifi КНсКА ■. И Рм- CiPQ'aQl«
■.fin ач efl i г & испй-чк jfiinn-i. P ирастп всиньнв eiи»чшн i иди и анй! гжвпдетв jt.
Ifi.HRrft* 1»11Л11ЫЙ И IM * AM^Hl* 1 ВДНИ С444 чьли ЦПЯ.М.^И^ТЙ
Pia флэы »лиимитрла-.*. Янн-a -е npi'l те m^iwn- inter*. ¡»tdiu прмивti- ijuhimiiгинн
«II^IH, - с с 4U*iiÜ*lr«*<r» •
> Ним uM|iüh ифин и-чч »яа*|-н(1»»МНтЫ1К tG^itahSffrtflfHsl* b'INieWfir.
Рис. 14. Путь установки [7].
4. После выбора папки нажимаем «Enter». На вопрос установщика об уверенности в установке в эту директорию, нажимаем «Y» и снова «Enter».
Далее предлагается выбрать букву виртуального диска. Нужно выбрать название диска, которого пока нет на компьютере.
Определи те сь с именем нового диск л, Как оптимальный вариант предлагается дн пк Zi ~ нала вероятно,. чти он у пап уме занят. Впрочем,, вы номе тс
ВПГСТИ и .t»li i|oj дрцгдо f. чкп Ц ДОС К Л, HOTfJpUH CLUi НС тлкяг. '!Rk Л l ЫП ilT ■■ СУчеС ЩушцИС JLHCKH Jii ПрС ДО HQ -
Ни l1 ин г с бчкнч if iiaiiuero иирт цельного диска [Z1: й
Рис. 15. Настройка виртуального диска [7].
5. Нажимаем «Enter». Последует копирование файлов в ту папку, которую мы указали изначально. После окончания копирования следует окно, в котором нужно ввести "1".
копируются фл.йлыг кднте . * .
Овновлнен параметры моме-ыг доац.ни . . .
1. Виртуальный диск создается ПРИ ЗЙГРИЗИЕ ОС. Залуе« серверов
6 рр0м<риь№ на P«ffq4»m с i ö л й* ■ Пр и jfocpuc4ич
potiorн Пенвера виррдольный мне к НЕ втнлпчаерои■
м Этот pewwrp реионенд'уптсп нслоль говлть,. если вы с вбираетесь
использовать виртуальным диск,, не запуская серверов {например* м хвтнте запускать Perl -енрнпты не только ни браузера, но н из и командной строки).
2. При загрузке ОС виртуальный диск НЕ создается. На Рлвочен с тол с ТЛИН«, и*и и в л«, I» создается ярлыки для 1ЛПУГ.КА и остановл серверов. При запуск* сср&срев «начале соэяавтсн еирт уллыммй дне«, после останова - дмех отключается.
™ Нвойксиине помни г ь» что о этан ренине при ивантивнон йенворе но т б ула р ни41 у на к вирр уал ьнону диску io чао iн во т и * к Рег1>. я Кроне того. некоторые версии Minnows не унект правильно dik лютаг ь и ниртральный диск Стребуется перезагрузил^.
Рекогкндцстся еыарать вариант 1, потопу что он нанволее удобен.
Васните 1 млн 2 lilt I_
Рис. 16. Подтверждение настройка виртуального диска [7].
6. После этих действий установщик закроется, и откроется браузер с заголовком «Денвер успешно установлен». На рабочем столе появилось 3 ярлыка:
0
Start Denwer
Restart Stop Denwer Denwer
Рис. 17. Ярлыки на рабочем столе [7].
7. Запускаем Денвер. В браузере (Internet Explorer, Opera, Mozilla Firefox и т.д.) вписываем адрес «localhost», в результате должно выйти сообщение с заголовком «Ура, заработало!».
Простой способ открытия сайта. Самый простой способ заставить Денвер открывать по адресу http://192.168.192.21 определенный сайт — это расположить документы сайта в директории /home/192.168.192.21/www.
Не забудьте также перезапустить Денвер.
Создаем БД на MySQL
QYWebServers Создаем БД на MySQL- для этого в адресной строке браузера вводим localhost/Tools/phpmyadmin
Мы попадаем на главную страницу для работы с MySql. На верхней панели выбираем Базы Данных. В соответствующее поле вводим название БД -petrol, в поле сравнение выбираем кодировку utf-8_general_ic. После этого на левой панели выбираем petrol. Нам открывается окно, в котором перечислены основные таблицы этой БД. Ниже будет область Создать таблицу. В соответствующие поля вводим название таблицы и количество столбцов. После нажатия кнопки OK откроется окно для создания структуры таблицы. После того, как таблица будет создана, ее название появится в левой части. Нажимаем petrol и в открывшемся окне выбираем наверху вкладку Вставить. Откроется окно для заполнения таблицы.
Создаем файловую структуру веб-сервера.
Рабочий стол сервера 1. Нажимаем «Пуск» - «Проводник». Открываем путь: С :/WebServers/home/192.168.192.21/www
Создаем в этой директории две папки: admin, client
Папка client
В папке client создаем два файла index.htm (в блокноте) и petrol.php (в блокноте) и сохраняем их. Ниже приведены листинги кодов для этих файлов. Файла index.htm следующего содержания:
<!doctype html> <head>
<title>ajax</ti tle>
<scri pt type="text/j avascri pt">
function getXmlHttp(){ var xmlhttp; try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
setInterval(function petrol() { var req = getXmlHttp()
var statusElem = document.getElementById('petrol_tab')
req.onreadystatechange = function() {
if (req.readyState == 4) { i f(req.status == 200) {
statusElem.innerHTML = req.responseText;
}
}
}
req.open('GET', 'petrol.php', true); //необходимо
указать путь к файлу, содержащему серверный скрипт для выборки данных из БД.
req.send(null);
},100); </script>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8"> </head> <body>
<div id="petrol_tab"></div> </body>
Файла petrol.php следующего содержания:
<?php
// определяем начальные данные необходимые для соединения с
БД
$db_host = 'localhost'; $db_name = 'petrol'; $db_username = 'root'; $db_password = ''; $db_table_to_show = 'petrol'; $result = mysql_query($sql);
// соединяемся с сервером базы данных
$connect_to_db = mysql_connect($db_host,
$db_username, $db_password)
or die("Could not connect: " . mysql_error());
// подключаемся к базе данных
mysql_select_db($db_name, $connect_to_db)
or die("Could not select db: " . mysql_error());
// выбираем все значения из таблицы "petrol"
$qr_result = mysql_query("select * from " . $db_table_to_show)
or die(mysql_error());
// выводим на страницу сайта заголовки HTML-таблицы, // количество заголовков должно соответствовать количеству столбцов
echo '<table border="1">'; echo '<thead>'; echo '<tr>'; echo '<th>id</th>'; echo '<th>petrol</th>'; echo '<th>price</th>'; echo '</tr>';
echo '</thead>'; echo '<tbody>';
// выводим в HTML-таблицу все данные из таблицы БД // количество столбцов должно соответствовать, количеству // столбцов в бд или количеству столбцов, запрашиваемых в // запросе
$qr_result = mysql_query
while($data = mysql_fetch_array($qr_result)){ echo '<tr>';
echo '<td>' . $data['id'] . '</td>'; echo '<td>' . $data['petrol'] . '</td>'; echo '<td>' . $data['price'] . '</td>'; echo '</tr>';
}
echo '</tbody>'; echo '</table>';
?>
Папка admin
В папке admin создаем 4 файла index.htm, getagents.php, css.css, ajax.js
(все файлы в блокноте) и сохранить
Файла index.htm следующего содержания:
<script language="javascript" src="ajax.js"></scn'pt> <link rel="stylesheet" href="css.css" type="text/css"> <body onLoad="getagents('id','')">
<div id="hiddenDIV" style="visibility:hidden; background-color:white; border: 0px solid black;"></div> </body>
Файла getagents.php следующего содержания:
<?
class clsAJAX {
// определяем данные для подключения к БД public $dbhost; public $dbuname; public $dbpass; public $dbname;
private $arrTable = "petrol";
public $arrFields = array('id', 'petrol', 'price'); // соединяемся с сервером БД
public function _construct()
{
$dbhost = "localhost"; $dbuname = "root"; $dbpass = ""; $dbname = "petrol";
$db = mysql_connect($dbhost, $dbuname, $dbpass); if (!$db) { die('There was a problem with the database, please try back later db.php'); } mysql_select_db($dbname, $db);
}
public function showList($id='') {
$textout = "";
$param = $_GET['param'];
$di r = $_get ['dir'];
if(strlen($param)>0){
$sortupimg = 'A'; $sortdownimg = 'v';
$param = $_REQUEST['param']; $dir = $_REQUEST['dir'];
//Генерируем поля таблицы
if ( $_GET['dir'] == 'desc' ) {
$textout .= '<tr class="txtheading">'; for ( $i = 0 ; $i < count($this-
>arrFields) ; $i ++ )
{
$textout .= ($_GET['param'] == $this->arrFields[$i])?'<td><a href="#" onClick=getagents("'.$this->arrFields[$i].'","")>'.$this->arrFields[$i].'</a> '.$sortdownimg.'</td>':'<td><a href="#"
onClick=getagents("'.$this->arrFields[$i].'","")>'.$this-
>arrFields[$i].'</a></td>';
}
$textout .= '<td></td><td></td>'; $textout .= '</tr>';
}
else {
$textout .= '<tr class="txtheading">';
for ( $i = 0 ; $i < count($this-
>arrFields) ; $i ++ )
{
$textout .= ($_GET['param'] == $this->arrFields[$i])?'<td><a href="#" onClick=getagents("'.$this->arrFields[$i].'","desc")>'.$this->arrFields[$i].'</a> ' .$sortupimg.'</td>':'<td><a href="#" onClick=getagents("'.$this-
>arrFields[$i].'","desc")>'.$this->arrFields[$i].'</a></td>';
}
$textout .= '<td></td><td></td>'; $textout .= '</tr>';
}
//заканчиваем генерировать поля
$arrf='';
for ( $i = 0 ; $i < count($this-
>arrFields) ; $i ++ )
{
$arrf .= ','.$this->arrFields[$i];
}
$q = 'SELECT
'.substr($arrf,1,strlen($arrf)).' from '.$this->arrTable.' order by '.$param.' '.$di r;
$result = mysql_query($q);
while( $myrow = mysql_fetch_array($result)
){
if ( $id == $myrow[$this-
>arrFields[0]] )
{
//определение поля для вывода значений из БД, необходимо, чтобы значения атрибутов //name, id соответствовали именам стоблцов в БД
$textout .= 1
<tr
class="txtcontents">
<td><input
type="text" size="15" class="textbox" name="id" id="id" readonly value="'.$myrow[$this->arrFields[0]].'"></td>
<td><input
type="text" size="15" class="textbox" name="petrol" id="petrol" value="'.$myrow[$this->arrFields[1]].'"></td>
<td><input
type="text" si ze="25" class="textbox" name="price" id="price" value="'.$myrow[$this->arrFields[2]].'"></td>
<td><a href="#"
onClick=saveRecord("save",'.$myrow[$this->arrFields[0]].',"'.$param.'","'.$dir.'")>Save</a> </td>
<td>| <a href="#" onClick=getagents("'.$param.'","'.$di r.'")>Cancel</a></td>
</tr>
j
}
else {
$textout .= '<tr
class="txtcontents">'; >arrFields) ; $i ++ )
for ( $i = 0 ; $i < count($this-{
$textout .= '<td
width="18%">'.$myrow[$this->arrFields[$i]].'</td>';
}
$textout .= '<td><a href="#" onClick=manipulateRecord("update",'.$myrow[$this->arrFields[0]].',"'.$param.'","'.$dir.'")>Update</a> </td>
<td>| <a href="#"
onClick=manipulateRecord("delete",'.$myrow[$this->arrFields[0]].',"'.$param.'","'.$dir.'")>Delete</a></td>
</tr>';
}
}
} else {
$textout='<tr><td colspan="6">No record
available..</td></tr>' ;
}
if ( $_REQUEST['mode'] != "new" ) {
$textout .= '<tr><td height="20"
valign="bottom" class="txtcontents" colspan="6">
<a href="#"
onClick=newRecord("new","'.$param.'","'.$di r.'")>New</a>
</td></tr>';
}
else if ( $_request['mode'] == "new" ) {
$textout .= 1
<tr
class="txtcontents">
/^определение полей для создания новой строки БД, необходимо, чтобы значения атрибутов
name, id соответствовали именам стоблцов в БД*/
<td></td>
<td><input
type="text" size="15" class="textbox" name="petrol" id="petrol" value="'.$myrow[$this->arrFields[1]].'"></td>
<td><input
type="text" si ze="25" class="textbox" name="price" id="price" value="'.$myrow[$this->arrFields[2]].'"></td>
<td><a href="#" onClick=saveNewRecord("newsave","'.$param.'","'.$di r.'")>Save</a> </td>
<td>| <a href="#" onClick=getagents("'.$param.'","'.$di r.'")>Cancel</a></td>
</tr>
j
}
echo "<table cellspacing=\"0\" border=\"0\" cel l padding=\"2\" ali gn=\"center\"
wi dth=\"70%\">".$textout."</tabl e>"; }
public function deleteRecord($id='') {
$result = mysql_query('delete from '.$this-
>arrTable.' where id = '.$id); }
public function saveEditedRecord() {
$q = 'update '.$this->arrTable.' set petrol = "'.$_REQUEST['petrol'].'" , price = "'.$_REQUEST['price'].'" where id ='.$_REQUEST['id'];
$result = mysql_query($q);
}
public function saveNewRecord() {
$q = 'insert into '.$this->arrTable.'(petrol,price) values("'.$_request['petrol'].'","'.$_REQUEST['price'].'")'; $result = mysql_query($q);
}
}
$obj = new clsAJAX();
if ( $_REQUEST['mode'] == "delete" ) {
$obj->deleteRecord($_REQUEST['id']); echo $obj->showList();
}
info@agequal.ru
if ( $_REQUEST['mode'] == "update" ) $obj->showList($_REQUEST['id']);
if ( $_REQUEST['mode'] == "save" )
$obj->saveEditedRecord(); $obj->showList();
if ( $_REQUEST['mode'] == "newsave" )
$obj->saveNewRecord(); $obj->showList();
if ( $_request['mode'] == "new" ) $obj->showList();
if ( $_REQUEST['mode'] == "list" ) $obj->showList();
Файла css.css следующего содержания: .txtheading{
font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; font-wei ght:bold
.txtcontents{
font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
}
.textbox {
font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; display:block; border-wi dth:1px;
}
}
Файла ajax.js следующего содержания:
function GetxmlHttpObject(handler) {
var objxmlHttp=null
if (navigator.userAgent.indexOf("Opera")>=0) {
alert("This example doesn't work in Opera")
return }
if (navigator.userAgent.indexOf("MSiE")>=0) {
var strName="Msxml2.XMLHTTP"
if (navigator.appversion.indexOf("MSiE 5.5")>=0) {
strName="Microsoft.XMLHTTP" }
try
{
objxmlHttp=new Activexobject(strName) objxmlHttp.onreadystatechange=handler
return objxmlHttp }
catch(e) {
alert("Error. Scripting for ActiveX might be
disabled")
return }
}
if (navigator.userAgent.indexOf("Mozilla")>=0) {
objxmlHttp=new XMLHttpRequest() objxmlHttp.onload=handle r objxmlHttp.onerror=handler
return objxmlHttp }
}
//определяем путь к серверному скрипту и передаем параметры var url = "getagents.php?param=";
function getagents(column,direc) { var
myRandom=parselnt(Math.random()*99999999);
xmlHttp=GetxmlHttpObject(handleHttpResponse);
xmlHttp.open("GET",url + escape(column) + "&mode=list&dir=" + direc + "&rand=" + myRandom, true);
xmlHttp.send(null);
}
//определяем функцию на сохранение записи
function saveRecord(mode,id,param,di r) {
/^определяем поля БД, в качестве значения метода getElementById указываем id, указанный в серверном скрипте*/
id = document.getElementById("id").value; petrol =
document.getElementById("petrol").value;
price = document.getElementById("price").value;
var
myRandom=parseInt(Math.random()*99999999);
xmlHttp=GetXmlHttpObject(handleHttpResponse);
xmlHttp.open("GET","getagents.php?id="+id+"&petrol="+petrol+" &price="+price+"&mode="+mode+"¶m=" + escape(param) + "&dir=" + dir + "&rand=" + myRandom, true);
xmlHttp.send(null);
}
function saveNewRecord(mode,param,di r) {
//uid = document.getElementById("id").value;
petrol =
document.getElementById("petrol").value;
price = document.getElementById("price").value;
if ( petrol.length == 0 || price.length == 0 )
{
alert("Please enter value for all the fields");
}
else {
var
myRandom=parseInt(Math.random()*99999999);
xmlHttp=GetXmlHttpObject(handleHttpResponse);
xmlHttp.open("GET","getagents.php?petrol="+petrol+"&price="+p rice+"&mode="+mode+"¶m=" + escape(param) + "&dir=" + dir + "&rand=" + myRandom, true);
Электронный научный журнал «Век качества» Online scientific journal «Age of Quality»
№ 3(2016) ISSN 2500-1841
http://www.agequal.ru info@agequal.ru
xmlHttp.send(null) ;
} }
functi on newRecord(mode,param,di r) {
var
myRandom=parselnt(Math.random()*99999999);
xmlHttp=GetxmlHttpObject(handleHttpResponse);
xmlHttp.open("GET","getagents.php?mode="+mode+"¶m=" +
escape(param) + "&dir=" + dir + "&rand=" + myRandom, true);
xmlHttp.send(null);
}
function manipulateRecord(mode,id,param,di r) {
if ( confirm("Are you sure you want to "+mode+"
record ?") != 1 ) {
return false;
}
var
myRandom=parselnt(Math.random()*99999999);
xmlHttp=GetxmlHttpObject(handleHttpResponse);
xmlHttp.open("GET","getagents.php?id="+id+"&mode="+mode+"&par am=" + escape(param) + "&dir=" + dir + "&rand=" + myRandom, true);
xmlHttp.send(null);
}
function handleHttpResponse() {
if (xmlHttp.readyState == 4) {
document.getElementByid("hiddenDiv").styl e.vi si bi l ity="vi sible";
document.getElementByid("hiddenDiv").innerHTML='';
document.getElementByid("hiddenDiv").i nnerHTML=xmlHttp.responseTex t;
}
}
Теперь осталось открыть страницы в Web-обозревателе и посмотреть на результат. В браузере клиента набираем ip адрес сервера с указанием требуемой
страницы index.htm. Должны увидеть актуальную таблицу с марками топлива и их ценами.
Тестирование работоспособности ИС
192.168.0.49/dfënt/index htm
nȕ
jid petrol Iprici!
|о !АЖ-Э5. 70
|1 ¡АЖ-98 62
Рис. 18. Форма для клиента. Разработано авторами.
192.168.0,49/admiriyindex. htm | ^ Поиск
id Л petrol price
0 АИ-95 70 Update 1 Delete
1 ДИ-98 63 Update 1 Delete
Рис. 19. Форма для администратора. Разработано авторами.
1
Список литературы
1. Воронцов Ю.А., Козинец А.В. Стандарты веб-сервисов для создания распределенных информационных систем / Ю.А.Воронцов, А.В.Козинец, // Век качества. 2015. №3. С. ...
2. Воронцов Ю.А., Козинец А.В. Пример построения распределенной информационной системы на AJAX с использованием PHP и IIS (Internet Information Services) / Ю.А.Воронцов, А.В.Козинец, // Век качества. 2016. №2. С. ...
3. Введение в виртуализацию [Электронный ресурс]. - Режим доступа: http://www.team.ru/virt intro.php (дата обращения 11.04.16г.).
info@agequal.ru
4. Компьютерный информационный портал «OS Zone» - Установка и настройка платформы виртуализации Oracle VM VirtualBox [Электронный ресурс]. - Режим доступа: http://www.oszone.net/13051 (дата обращения 11.04.16г.).
5. Установка VirtualBox [Электронный ресурс]. - Режим доступа: http://itandlife.ru/technology/emulation_and_virtualization/virtualbox-setup-and-settings/2147483644/ (дата обращения 11.04.16г.).
6. Настройка сети в VirtualBox [Электронный ресурс]. - Режим доступа: http://rus-linux.net/MyLDP/vm/VirtualBox-networking.html (дата обращения 11.04.16г.).
7. Блог Максима Зайцева - Установка Денвера (локального сервера) на компьютер [Электронный ресурс]. - Режим доступа: http://1zaicev.ru/ustanovka-denvera-lokalnogo-servera-na-kompyuter/ (дата обращения 19.10.16г.).
8. Architecture of user applications for network with mobile nodes / Vorontsov Y.A., Farkhadov M.P., Blinova O.V., Abramenkov A.N. // 18-я международная конференция «Распределенные компьютерные и коммуникационные сети: управление, вычисление, связь» (DCCN-2015). С 460-465.
Sample web-service using Apache and MySQL
Vorontsov Yuri Alexeevich
Head of the Department of information systems, Professor, Doctor of technics, Moscow Technical University of Communications and Informatics #32, Narodnogo Opolcheniya street, Moscow, 123993, Russain Federation
yvorontsov. 1943@mail. ru Kozinets Arthur Valerievich
info@agequal.ru
Head of laboratories of the Department of information systems Moscow Technical University of Communications and Informatics #32, Narodnogo Opolcheniya street, Moscow, 123993, Russain Federation
kozinets@mtuci2. ru
Abstract. The article describes an example of building a web-service. For the implementation used the scripting language PHP as well as the Apache web server. Data is stored in a database via MySQL. Virtualization is applied when building model of information system.
Key words: distributed information systems; web services; PHP; Apache;
1. Vorontsov Yu.A., Kozinets A.V. Standarty veb-servisov dlya sozdaniya raspredelennykh informatsionnykh sistem / Yu.A.Vorontsov, A.V.Kozinets, // Vekkachestva. 2015. №3. S. ...
2. Vorontsov Yu.A., Kozinets A.V. Primer postroeniya raspredelennoy informatsionnoy sistemy na AJAX s ispol'zovaniem PHP i IIS (Internet Information Services) / Yu.A.Vorontsov, A.V.Kozinets, // Vek kachestva. 2016. №2. S. ...
3. Vvedenie v virtualizatsiyu [Elektronnyy resurs]. - Rezhim dostupa: http://www.team.ru/virt_intro.php (data obrashcheniya 11.04.16g.).
4. Komp'yuternyy informatsionnyy portal «OS Zone» - Ustanovka i nastroyka platformy virtualizatsii Oracle VM VirtualBox [Elektronnyy resurs]. -Rezhim dostupa: http://www.oszone.net/13051 (data obrashcheniya 11.04.16g.).
MySQL.
REFERENCES
5. Ustanovka VirtualBox [Elektronnyy resurs]. - Rezhim dostupa: http://itandlife.ru/technology/emulation_and_virtualization/virtualbox-setup-and-settings/2147483644/ (data obrashcheniya 11.04.16g.).
6. Nastroyka seti v VirtualBox [Elektronnyy resurs]. - Rezhim dostupa: http://rus-linux.net/MyLDP/vm/VirtualBox-networking.html (data obrashcheniya 11.04.16g.).
7. Blog Maksima Zaytseva - Ustanovka Denvera (lokal'nogo servera) na komp'yuter [Elektronnyy resurs]. - Rezhim dostupa: http://1zaicev.ru/ustanovka-denvera-lokalnogo-servera-na-kompyuter/ (data obrashcheniya 19.10.16g.).
8. Architecture of user applications for network with mobile nodes / Vorontsov Y.A., Farkhadov M.P., Blinova O.V., Abramenkov A.N. // 18-ya mezhdunarodnaya konferentsiya «Raspredelennye komp'yuternye i kommunikatsionnye seti: upravlenie, vychislenie, svyaz'» (DCCN-2015). S 460-465.