WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Установка Apache 2, PHP 5, mod_perl 2 в связке с Oracle 10.2


Прислал: Алексей Межецкий [ 05.08.2009 @ 15:37 ]
Раздел:: [ Веб-технологии ]


Работая в одной компании, я столкнулся с тем, что нужно было реализовать безопасный 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

//http2d.apache.org/download.cgi

PHP

5.2.9

//www.php.net/downloads.php

Mod_perl

2.0.4

//perl.apache.org/download/index.html

DBI

1.607

//www.perl.com/CPAN/modules/by-category/07_Database_Interfaces/DBI/

DBD-Oracle

1.22

//www.perl.com/CPAN/modules/by-category/07_Database_Interfaces/DBD/

Установка Apache

Скачайте http2d-2.2.11.tar.bz2 с сайта производителя, зайдите под root'ом и выполните следующие команды:

# tar -jxvf http2d-2.2.11.tar.bz2

# cd http2d-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, написано в статье //www.webscript.ru/stories/04/05/29/2604693, копия лежит //www.opennet.ru/base/sec/ssl_cert.txt.html, не вижу смысла пересказывать текст.

Запуск и остановка Apache

Перед запуском необходимо в конфигурационном файле http2d.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 с помощью любого веб-браузера. Напишите в адресной строке //<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



Смотрим, чтобы в конфигурационном файле http2.conf были прописаны строчки:

LoadModule php5_module   modules/libphp5.so
AddType application/x-http2d-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. Откройте его в браузере: //<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. Которые описаны в статье //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

Открываем http2d.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-1nn";
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=win1251nn";
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 – пароль пользователя базы.

Если все выполнено правильно, то все должно работать иначе смотрим логии Апача и разбираемся.

Межецкий Алексей. absz@yandex.ru




 :::::  Светодиод пишет 12.09.2009 @ 17:31 
Спасибо! Все сделал как написано, получилось! Ура!
 :::::  Александр пишет 08.02.2010 @ 15:28 
вот спасибки !!! давно искал ... СПАСИБО
 :::::  Виктор пишет 25.08.2011 @ 00:35 
Я немного непонял если задача стоит о получения пользователя информации из бд с последующей обработки в excel.То спрашивается а
зачем использовать дополнительные модули как per-ловский модул. На этот случай можно было сделать парочку представления для
юзеров и выбирать данные из самое excel через ODBC и у них будет всегда информации актуальная из баз.Получается они открыли
обычный excel документ и все у них вся инфа уже в excel.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0305600