Ключевые слова:oracle, database, linux, apache, perl, php, (найти похожие документы)
From: Межецкий Алексей <absz@yandex.ru.>
Newsgroups: email
Date: Mon, 30 Jun 2009 17:02:14 +0000 (UTC)
Subject: Установка Apache 2, PHP 5, mod_perl 2 в связке с Oracle 10.2
Работая в одной компании, я столкнулся с тем, что нужно было
реализовать безопасный web-доступ сторонним организациям к данным,
находящимся внутри сети этой компании. В качестве СУБД использовалась
Oracle. Проект нужно было реализовать, как говорится, "вчера", плюс,
зная из опыта, отчеты лучше было формировать в таблицы Excel, с
соответствующим форматированием и формулами, которые коммерсанты
компании доделывают сами и не дергают программистов, т.к. то, что и как
им нужно они сами иногда не знают. Более полноценной поддержки и
описания формата Excel чем в PHP я не нашел, если кто знает, например в
perl, или других языках, напишите.
В интернете можно было найти множество рекомендаций, по связке
"Apache+PHP+mod_perl+Oracle", но, как правило, они уже устарели,
поэтому, перелопатив информацию в Интернете и документацию на указанные
выше продукты, решил написать данную статью.
Итак, пройдемся по порядку, в качестве сервера используется Centos 5.2
(бесплатный аналог Red Hat Enterprise Linux 5.2), СУБД Oracle 10.2, в
качестве сервера приложений используется Apache 2.2. Если Apache
устанавливается на отдельном сервере, то на нем нужно устанавливать и
Клиента Oracle 10.2.
В данной статье не рассматривается установка СУБД Oracle или клиента,
будем считать, что они уже установлены на сервер. Единственное что надо
сделать, так получить nobody доступ к его директории. Для Oracle 10.2.
существует скрипт $ORACLE_HOME/install/changePerm.sh.
Требуемый софт
Apache 2.2.11 http://httpd.apache.org/download.cgi
PHP 5.2.9 http://www.php.net/downloads.php
Mod_perl 2.0.4 http://perl.apache.org/download/index.html
DBI 1.607 http://www.perl.com/CPAN/modules/by-category/07_Database_Interfaces/DBI/
DBD-Oracle 1.22 http://www.perl.com/CPAN/modules/by-category/07_Database_Interfaces/DBD/Установка Apache
Скачайте httpd-2.2.11.tar.bz2 с сайта производителя, зайдите под
root'ом и выполните следующие команды:
# tar -jxvf httpd-2.2.11.tar.bz2
# cd httpd-2.2.11
# ./configure --prefix=/u01/app/apache --enable-module=so --enable-info --enable-ssl
# make
# make install
При настройке веб-сервера опция --enable-module=so позволяет php и
mod_perl быть общим динамическим объектом(Dynamic Shared Object, DSO).
--prefix=/u01/app/apache - каталог установки apache
--enable-info - модуль информации о сервере, можно не включать
--enable-ssl - поддержка SSL, так сервер будет использоваться для
доступа сторонних организаций через Интернет. О том, как правильно
настроить SSL, написано в статье
http://www.webscript.ru/stories/04/05/29/2604693, копия лежит
http://www.opennet.dev/base/sec/ssl_cert.txt.html, не вижу смысла
пересказывать текст.
Запуск и остановка Apache
Перед запуском необходимо в конфигурационном файле httpd.conf в директории
программы необходимо изменить параметры перенесите корень дерева документов:
RootDocument /var/www/html
<Directory "/var/www/html">
AllowOverride None
Order allow,deny
Allow from all
</Directory>
И определить пользователя и группу от имени которого запускаются
процессы
User apache
Group apache
Далее создаем скрипт следующего содержания для запуска, называем его
apache:
#!/bin/sh
# chkconfig: 345 99 10
export ORACLE_HOME=/u01/app/oracle/oracle/product/10.2.0/db_1
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32
if [ ! -f /u01/app/apache/bin/apachectl ]
then
echo "Apache startup: cannot start"
exit
fi
case "$1" in
'start')
/u01/app/apache/bin/apachectl start
;;
'stop')
/u01/app/apache/bin/apachectl stop
;;
Esac
переменные окружения указанные в файле нужны для работы PHP и mod_perl
export ORACLE_HOME=/u01/app/oracle/oracle/product/10.2.0/db_1
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32
Делаем исполняемым chmod +x apache.
Помещаем в /etc/rc.d/init.d
# chmod +x apache
# cp apache /etc/rc.d/init.d
# /etc/rc.d/init.d/apache start
Необходимо проверить работу Apache с помощью любого веб-браузера.
Напишите в адресной строке http://<IP адрес сервера>/.
Если на файерволе нет ограничений, то тестовая страница должна
открыться.
Теперь остановите веб-сервер и можно приступить к конфигурации php:
# /etc/rc.d/init.d/apache stop
Установка PHP
Загрузите файл php-5.2.9.tar.bz2 со страницы разработчика
# tar -jxvf php-5.2.9.tar.bz2
# cd php-5.2.9
# export ORACLE_HOME=/u01/app/oracle/oracle/product/10.2.0/db_1
# export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
# export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32
# ./configure --with-apxs2=/u01/app/apache/bin/apxs --with-oci8=$ORACLE_HOME \
--with-config-file-path=/u01/app/apache/conf --enable-sigchild --prefix=/u01/app/php --with-zlib
# make
# make install
Копирум конфигурационный файл:
# cp php.ini-recommended /u01/app/php/php.ini
Смотрим, чтобы в конфигурационном файле http.conf были прописаны
строчки:
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php .cgi
PHPIniDir "/u01/app/php"
Запускаем apache
# /etc/rc.d/init.d/apache start
Тестирование Apache и PHP с Oracle
Для тестирование PHP с Oracle необходимо поместить php файл в htdocs
директорию /var/www/html.
Вот два файла. Первый используется для тестирования php. Откройте его в
браузере: http://<IP адрес сервера>/phpinfo.php. Если php установлен,
вы увидите полный список конфигурации этого модуля.
phpinfo.php
<?php phpinfo(); ?>
Проверьте в первой таблице в строчке Configure Command в параметре
--with-oci8 должен быть указан путь к ORACLE_HOME. В таблице OCI8,
должна быть строчка OCI8 Support - enable.
oci8test.php
Второй файл запрашивает системное время используя, подключение к СУБД
Oracle
<?php
$dbuser = ""; // имя пользователя СУБД
$dbpass = ""; // пароль пользователя
$dbname = ""; // TNS имя базы
$sql = "select sysdate from dual";
if ($c = OCILogon($dbuser, $dbpass, $dbname)) {
$s = OCIParse($c, $sql);
OCIExecute($s, OCI_DEFAULT);
if (OCIFetch($s)) {
echo "Текущее время" . ociresult($s, 1);
}
OCILogoff($c);
} else {
$err = OCIError();
echo "Oracle Connect Error " . $err[text];
}
?>
Установка поддержки формирования таблиц Excel и их разработка
осуществляется через расширение PHP - PEAR. Которые описаны в статье
http://www.phpclub.ru/detail/article/Excel_Writer. Рассмотрение
данной темы выходит за рамки статьи, к тому же в этой статье подробно
рассмотрен данный вопрос и добавить к этому нечего.
Установка mod_perl
Загружаем с сайтов разработчиков файлы
DBI-1.607.tar.gz
DBD-Oracle-1.22.tar.gz
mod_perl-2.0-current.tar.gz
# tar -zxvf DBI-1.607.tar.gz
# cd DBI-1.607
# perl Makefile.PL
# make
# make test
# make install
# tar -zxvf DBD-Oracle.tar.gz
# cd DBD-Oracle
# perl Makefile.PL
# make
# make install
# tar -zxvf mod_perl-2.0-current.tar.gz
# cd mod_perl-2.0.4
# perl Makefile.PL MP_APXS=/u01/app/apache/bin/apxs
# make
# make install
Открываем httpd.conf добавляем туда строчки
LoadModule perl_module modules/mod_perl.so
PerlOptions +Parent
PerlSwitches -I/var/www/pcgi
Alias /pcgi/ /var/www/pcgi/
<Directory "/var/www/pcgi">
SetHandler perl-script
PerlResponseHandler ModPerl::RegistryPrefork
PerlOptions +ParseHeaders
Options +ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
LoadModule - загрузка модуля perl
PerlOptions +Parent дает возможность использовать отдельный компилятор
со своей средой (для этого требуется multi-threaded версия perl).
PerlSwitches -I/var/www/pcgi добавляет указанную папку в @INC
компилятора (отдельного для этого VH).
Alias дает псевдоним для пути /pcgi/, который мы будем использовать для
обращения к скриптам с mod_perl.
Далее определяем опции для спевдонима /pcgi (для mod_perl-скриптов).
Первые три инструкции стандартны для mod_perl директорий: мы указываем
SetHandler (обработчик) как perl-script, PerlResponseHandler как
ModPerl::RegistryPrefork (собственно, это главная инструкция, мы
используем именно RegistryPrefork), PerlOptions добавляет опцию
автоматической обработки заголовков скриптов (теоретически, их можно не
печатать). Options +ExecCGI еще разрешаем выполнение скриптов в по
этому пути.
Перезагружаем "Апач"
Для тестирования mod_perl и Oracle Вам необходимо поместить файлы в
/var/www/pcgi директорию.
Файл printenv выводит переменные окружения
print "Content-type: text/plain; charset=iso-8859-1\n\n";
foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|\n|\\n|g;
$val =~ s|"|\\"|g;
print "${var}=\"${val}\"\n";
}
Файл ora_test выводит текущую дату обращаясь к Оракл
print "Content-type: text/html; charset=win1251\n\n";
use strict;
use DBI;
my $dbh = DBI ->connect
( 'dbi:Oracle:orabase', 'user', 'password',
{RaiseError => 1,
AutoCommit => 0} );;
my $sql = qq{ SELECT sysdate FROM dual };
my $sth = $dbh->prepare( $sql );
$sth->execute();
while ( my($sysdate) = $sth->fetchrow_array) {
printf ("%s ", $sysdate );
print "\n";
}
$dbh->disconnect();
оrabase - TNS имя базы берется в tnsnames.ora
user - имя пользователя базы
password - пароль пользователя базы.
Если все выполнено правильно, то все должно работать иначе смотрим
логии Апача и разбираемся.
Thank you for the good article.
If you are still interested in working with Excel
from Perl, let me know (tolq@yahoo.com) and I'll
send you all info you need.