Я изо всех сил пытаюсь подключить свое PHP-приложение к базе данных Oracle. Я пробовал несколько вариантов за последнюю неделю, но безуспешно.
Мне удалось установить расширение oci8, но функция oci_connect не распознается.
Пожалуйста помогите.
RedHat Enterprise Linux 7.6
PHP: 7.3
Оракул: 12c
Пытаясь понять это больше недели, вот краткое изложение того, что в конечном итоге сработало. Я надеюсь, что это поможет кому-то еще.
Эти инструкции относятся к установкам RedHat/CentOS Linux. По моему опыту, инструкции для RedHat/CentOS немного отличались от других установок Linux. ИЗБЕГАЙТЕ указаний Oracle... Они совсем не помогли!
Шаг 1: Я следовал инструкциям на этом замечательном веб-сайте, чтобы установить PHP 7.3 и дополнительные RPM-пакеты Remi: https://tecadmin.net/install-php7-on-centos7/.
Шаг 2: Затем я использовал репозиторий Remi (см. шаг 1) для установки расширения oci8:
$ sudo yum --enablerepo=remi-php73 install php-oci8
Шаг 3: Теперь нам нужно установить пакеты мгновенного клиента oracle 18.3. Это очень хорошо объяснено на этом сайте: https://qiita.com/tkprof/items/2a4eb868f45fb5759110
$ cd /etc/yum.repos.d
$ sudo wget http://yum.oracle.com/public-yum-ol7.repo
$ sudo wget http://yum.oracle.com/RPM-GPG-KEY-oracle-ol7
$ sudo rpm --import RPM-GPG-KEY-oracle-ol7
$ sudo yum-config-manager --enable ol7_oracle_instantclient
$ sudo yum install oracle-instantclient18.3-basic
$ sudo yum install oracle-instantclient18.3-devel
$ sudo yum install oracle-instantclient18.3-jdbc
$ sudo yum install oracle-instantclient18.3-sqlplus
$ sudo yum list oracle-instantclient*
Шаг 4: Файлы оракула были созданы в /usr/lib/oracle/18.3 Теперь нам нужно создать символическую ссылку, чтобы файлы оракула включались при запуске сервера:
$ sudo sh -c "echo /usr/lib/oracle/18.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
$ sudo ldconfig
Шаг 5: Перезапустите сервер
$ sudo systemctl stop httpd
$ sudo systemctl start httpd
Шаг 6: Теперь мы можем создать простой файл php, который проверяет подключение к Oracle:
<?php
$conn = oci_connect("username", "password", "//url/SID");
if (!$conn) {
echo "oci8 working! However the following errors occurred: <br>";
$m = oci_error();
echo $m['message'], "\n";
exit;
} else {
print "Connected to Oracle!";
}
// Close the Oracle connection
oci_close($conn);
Если вы получите системную ошибку, значит установка не сработала.
Обновление для последней версии Oracle Instant Client версии 19.3 для PHP-OCI8:
>> wget http://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/getPackage/oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
>> wget http://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/getPackage/oracle-instantclient19.3-devel-19.3.0.0.0-1.x86_64.rpm
>> wget http://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/getPackage/oracle-instantclient19.3-jdbc-19.3.0.0.0-1.x86_64.rpm
>> wget http://yum.oracle.com/repo/OracleLinux/OL7/oracle/instantclient/x86_64/getPackage/oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm
>> sudo yum localinstall oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm oracle-instantclient19.3-devel-19.3.0.0.0-1.x86_64.rpm oracle-instantclient19.3-jdbc-19.3.0.0.0-1.x86_64.rpm oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm
// create symbolic link
eu-onesead-d001 ~]# sudo sh -c "echo /usr/lib/oracle/19.3/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf"
eu-onesead-d001 ~]# sudo ldconfig
Перезагрузите сервер
Чтобы проверить соединение, я создал файл php, который загружаю на сервер и проверяю через браузер. ПРИМЕЧАНИЕ: вам, очевидно, следует проявить соответствующую осторожность и удалить файл после тестирования:
<?php
echo "Ensure you have restarted the server if you have installed any new extensions!";
echo "<br>Attempting Oracle db connection...";
// this will open the oracle extension and execute a connection
try {
$conn = oci_connect(
"username_goes_here",
"password_goes_here",
"//oracle_server_address_goes_here/sid_goes_here");
echo "<br>OCI Connect extension found.. opening connnection...";
if (!$conn) {
echo "<br>Function 'oci_connect' found and working but cannot connect to Oracle: <br>";
$m = oci_error();
echo $m['message'], "\n";
exit;
} else {
echo "<br>SUCCESS: Connected to Oracle!";
}
} catch (Exception $e) {
echo $e->getMessage();
}
// Close the Oracle connection
oci_close($conn);
echo "<br>Connection closed";
echo "<br>For security, please delete this file off the server";
Имейте в виду, что следующие версии будут использовать Oracle Client 19.3. "rpm -qi php-oci8" предоставляет эту информацию.