我正在尝试设置 php/nginx 来连接到 oracle 数据库。
所有内容都在一台服务器上(测试)
我安装了 nginx 并进行了设置,一切正常。我设置了 php 和 php-fpm,一切正常(测试了一些 php 内容)
我使用 pecl install oci8 安装了 oci8 模块并提供了到我的 oracle_home 的路径,它编译得很好。
但我无法连接到数据库。
我尝试了多个脚本。
我对 Oracle 还很陌生。
php-fpm 的 www-error 日志提示检查我的 oracle_home 和 ld 库路径。我将这两项都设置为我的 php 脚本进行测试,但仍然失败。
有任何想法吗?
<?php
PutEnv("ORACLE_SID=orcl");
PutEnv("ORACLE_HOME=/opt/app/oracle/product/11.2.0/dbhome_1/");
PutEnv("TNS_ADMIN=/opt/app/oracle/product/11.2.0/dbhome_1/network/admin");
PutEnv("LD_LIBRARY_PATH=/opt/app/oracle/product/11.2.0/dbhome_1/lib");
$c = oci_connect("testuser", "testpassword", "127.0.0.1");
if (!$c) {
echo "Unable to connect: " . var_dump( oci_error() );
die();
}
东欧经贸合作组织
从错误日志中:
[2010 年 12 月 10 日 17:25:58] PHP 警告:oci_connect():OCIEnvNlsCreate() 失败。您的系统出现问题 - 请检查 ORACLE_HOME 和 LD_LIBRARY_PATH 是否已设置并指向 /usr/share/nginx/html/orcl2.php 第 6 行中的正确目录
编辑:我将 nginx 用户添加到 oinstall 组以进行测试,现在我确实收到了更好的错误消息,因此我取得了进一步的进展。
现在的错误是:
array(4) { ["code"]=> int(12504) ["message"]=> string(70) "ORA-12504: TNS:listener 未在 CONNECT_DATA 中提供 SERVICE_NAME" ["offset"]=> int(0) ["sqltext"]=> string(0) "" } 无法连接:
EDIT2:完成下列操作后,我现在可以使用 sqlplus 命令连接我的测试用户,但 php 仍然失败。
SQL> alter system set LOCAL_LISTENER='10.99.101.2' scope=both;
SQL> alter system register;
SQL> alter system set SERVICE_NAMES='10.99.101.2' scope=both;
EDIT3:如果我使用 php 命令行来运行我的测试脚本,它可以正常工作,因此所述 nginx 的 Nginx/env 变量有问题。
编辑4:Listener.ora:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /opt/app/oracle/product/11.2.0/dbhome_1/)
(PROGRAM = extproc)
)
(SID_DESC=
(GLOBAL_DBNAME=orcl)
(ORACLE_HOME=/opt/app/oracle/product/11.2.0/dbhome_1/)
(SID_NAME=orcl)
)
)
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.99.101.2)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /opt/app/oracle
tnsnames.ora:
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.99.101.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
)
sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
ADR_BASE = /opt/app/oracle
答案1
您的连接字符串不正确。您确定“奥克尔“是您的数据库的 SID,而不是服务名称或 tnsnames.ora 中条目的名称(应该在 $TNS_ADMIN/ 中)?
以下命令的结果是什么?
$ORACLE_HOME/bin/tnsping orcl
$ORACLE_HOME/bin/lsnrctl status
您可以使用以下命令连接到数据库吗?
$ORACLE_HOME/bin/sqlplus "testuser"/"testpassword"@orcl