По понятным причинам для киоска потребовалось разработать упрощённый интерфейс пользователя, который было решено реализовать как web-приложение. Имея в штате опытных web-программистов, уверенно владеющих php, решили (для скорости) поручить им написание этого приложения, организовав связь с базой данных нашей медицинской системы. Рассматривалось 3 варианта взаимодействия:
- ODBC
- JDBC
- web-сервисы.
Web-программисты предпочли ODBC как наиболее простой с их точки зрения вариант, и альфа-версия киоска довольно быстро увидела свет. Однако вскоре выяснилось (surprise!), что php-код должен работать не под Windows, как это было у разработчика, а под Linux, несмотря на то, что в те годы наша медицинская система эксплуатировалась заказчиком на платформе Windows 2008. Чтобы «подружить» всех членов триады (Linux – ODBC-драйвер Caché — php5) потребовались определённые усилия. Последовательность проделанных действий я зафиксировал в виде наброска к данной статье, которую и предлагаю вашему вниманию.
Установка драйвера ODBC
Это можно сделать несколькими способами, а именно, с помощью:
- пользовательской установку Caché for Linux, выбрав ODBC Client как опцию;
- клиентской установки (скрипт cinstall_client, имеется в DVD-версии дистрибутива);
- отдельной установки (Stand-alone installation) клиента ODBC.
Ниже будет описан последний вариант как наиболее практичный, поскольку может быть выполнен как с .tar.gz-дистрибутива, так и с его полной DVD-версии, а также из дистрибутива ODBC-драйвера Caché, распространяемого в виде отдельного файла. Проверено в Ubuntu 9.10 и в Fedora 8 с ODBC-драйверами Caché 2008.1 и 2009.1.
Cмонтируйте dvd с дистрибутивами Caché для UNIX-ов и перейдите в каталог с дистрибутивами ODBC:
sudo mount /dev/dvd /media
Если ваш дистрибутив не на DVD, а в виде .tar.gz-файла (например, cache-2009.1.2.602-lnxrhx64.tar.gz), распакуйте его куда-нибудь. Дальнейшее не зависит от варианта дистрибутива. Создайте (где вам удобно) папку для установки драйвера. Обозначим её $folder.
mkdir $folder
Найдите в дистрибутиве драйвер под вашу платформу:
cd /media/dist/ODBC
Если у вас x86_x64, выберите ODBC-lnxrhx64.tar.gz, если x86_x32, то — ODBC-lnxrhx86.tar.gz. Скопируйте архив в выбранную вами папку $folder и распакуйте его в ней, после чего запустите инсталлятор. Установка пройдёт в ту же папку, вопросов не будет.
cd $folder tar -xvf ODBC-lnxrhx86.tar.gz ./ODBCinstall
Настройка источников данных
Далее, перейдите в mgr
cd $folder/mgr
и отредактируйте файл cacheodbc.ini, изменив определения Driver, Host, Port (и, возможно, Password) в секциях описаний источников данных:
[Samples] Driver = $folder/bin/libcacheodbc.so Description = Cache ODBC driver Host = IP-адрес или DNS-имя сервера Caché Namespace = SAMPLES UID = _SYSTEM Password = SYS (если Caché установлена с минимальной безопасностью, то скорее всего, этот пароль подойдёт) Port = TCP-порт суперсервера Caché (обычно 1972)
Для проверки драйвера и источника данных Samples выполните:
cd $folder/dev/odbc/samples/select ./select.sh # простейший select из таблицы Samples.Person
Работа с источниками данных (DSN) Caché ODBC из apache2 / php5
Установка локализации CP1251
Надо сказать, что результирующий набор, возвращаемый Caché ODBC, всегда имеет кодировку CP1251 (вне зависимости от типа установки Caché — 8-бит (локализация RUW8) или Unicode (RUSW)). По крайней мере, я не знаю, как это изменить. Поэтому надо установить в Linux соответствующую локализацию. Например, в Ubuntu 9.10 это делается так:
sudo locale-gen ru_RU.CP1251 locale -a | grep 1251
в списке локализаций появятся:
ru_RU.cp1251
В RedHat-подобных дистрибутивах (проверено в Fedora Core 8, CentOS 5.x) локализация устанавливается так:
sudo localedef --no-archive -c -f CP1251 -i ru_RU ru_RU.CP1251
Проверка наличия ru_RU.cp1251 выполняется аналогично:
locale -a | grep 1251
Далее, чтобы из php можно было обращаться к DSN, надо прописать их в ODBC-менеджере. Наиболее известны следующие два: iodbc и unixodbc. Ниже — описание для unixodbc и Ubuntu 9.10.
Установка менеджера ODBC unixodbc (в Ubuntu 9.10)
Методика позаимствована из ru.php.net/manual/en/function.odbc-connect.php. А именно, установите:
sudo apt-get install <имя-пакета>
следующие пакеты:
apache2 apache2-mpm-prefork apache2-utils apache2.2-common libapache2-mod-php5 odbcinst1debian1 php5 php5-cli php5-common php5-odbc unixodbc
после чего перезапустите apache:
sudo /etc/init.d/apache2 restart
Регистрация драйвера и DSN Caché ODBC в unixodbc
Вспомнив, что Caché ODBC был установлен в $folder, выполните:
cd $folder/dev/odbc/redist/unixodbc
Скопируйте odbcinst_template.ini в odbcinst.ini и дважды пропишите в этом файле путь к драйверу ($folder/bin/libcacheodbc.so). Скопируйте odbc_template.ini в odbc.ini и пропишите в этом файла IP, Port, Namespace, UID и Password, соответствующие источнику данных. Повторите для каждого DSN, если их несколько. Для тестирования имеет смысл создать источник Samples (его заготовка присутствует в odbc_template.ini), используя те же параметры, что и в разделе «Настройка источников данных». Создайте также DSN, нацеленный на прикладную область (допустим, она называется QMS), добавив новую секцию в odbc.ini путем копирования секции [samples]. Назовите секцию так же, как называется область, и поменяйте — по отношению к Samples — всего один параметр:
[QMS] ... Namespace = QMS
Все DSN могут быть описаны в одном файле odbc.ini.
Используемые значения Host, Namespace, Port, UID и Password должны соответствовать действительности, а именно, по этим реквизитам должны быть доступны области Caché, содержащие таблицы и/или хранимые процедуры. Способ проверки, понятное дело, зависит от вида хранимых данных. Если в вашей Caché сервис %Service_Bindings допускает вход без аутентификации, можно оставить реквизиты UID и Password пустыми (обязательно оба этих поля). В некоторых версиях Сache в примере odbc_template.ini задано неверное значение Password для суперпользователя _system, отличное от действующего по умолчанию при выборе минимальной безопасности в Caché (подсказка: пароль зависит от регистра). Кроме того, администратор Caché мог изменить пароль. И наконец, сохранять логин/пароль в DSN небезопасно, так поступать рекомендуется лишь в ходе тестирования; в процессе эксплуатации более целесообразно «зашить» их в php-приложение и передавать серверу при установлении соединения через ODBC.
Далее зарегистрируйте драйвер и все имеющиеся DSN:
sudo odbcinst -i -d -f odbcinst.ini sudo odbcinst -i -s -l -f odbc.ini
После регистрации в файлах /etc/odbc.ini и /etc/odbcinst.ini должны появиться соответствующие записи.
Тестирование в php
Если вы всё сделали правильно и описали источник данных SAMPLES, заработает пример $folder/dev/odbc/samples/php/sample.php, установленный вместе с драйвером Caché ODBC. Если вы захотите попробовать что-нибудь русское (ну и наконец приступить к тестированию вашей разработки), не забудьте вставить поближе к началу вашего php-кода установку текущей локализации CP1251:
echo setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');
Заключение
Напоследок несколько слов относительно общей архитектуры решения (браузер в киоске — php-приложение — БД Caché). В нашем случае она упростила разделение труда между web-разработчиками и прикладными программистами Caché и облегчила жизнь web-разработчикам, сохранив максимально привычную и комфортную для них среду. При этом мы, конечно, понимали, что прямое взаимодействие (браузер на клиенте — прикладной код в Caché) должно быть более эффективно как с точки зрения производительности, так и с точки зрения простоты конфигурации. Это понимание с годами только усилилось, и нашло отражение при создании полнофункционального web-интерфейса с нашей медицинской системой.
Тем не менее, ODBC-доступ к Caché по-прежнему занимает определённую «экологическую нишу», поскольку:
- он отличается более высокой производительностью, чем многие другие методы доступа (например, SOAP);
- он позволяет обращаться к таблицам напрямую, без промежуточных хранимых процедур;
- это неплохой способ «формализовать отношения» в тех случаях, когда разработка специализированного внешнего интерфейса осуществляется сторонней командой.
ссылка на оригинал статьи http://habrahabr.ru/company/intersystems/blog/156321/
Добавить комментарий