如何解决在 Azure 中使用 PHP OCI8 oci_connect 时出现 ORA-12154: TNS 错误

问题描述 投票:0回答:1

我正在尝试连接到新合作伙伴 11g 版本 11.2.0.4.0 的 Oracle 数据库,但收到以下错误:

警告: oci_connect(): ORA-12545: 连接失败,因为目标主机或对象不存在

合作伙伴确认提供的连接字符串正确。

这是我的 oci_connect() 的当前结构以及正在使用的所述连接字符串:

$connection_string = '(DESCRIPTION = (ADDRESS_LIST = (LOAD_BALANCE = ON)(FAILOVER = ON)(ADDRESS = (PROTOCOL = TCP)(HOST = HOST)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = SERVICE_NAME)))'
$conn = oci_connect($username, $password, $connection_string, 'UTF8', OCI_DEFAULT);

但是,当使用以下结构时:

$connection_string = 'user/password@host:port/service_name'
$conn = oci_connect($username, $password, $connection_string, 'UTF8', OCI_DEFAULT);

返回:

警告:oci_connect():ORA-12154:TNS:无法解析指定的连接标识符

为了清楚地了解我所做的事情,以下是我创建应用程序服务并安装 oci8 php 驱动程序所采取的步骤:

  1. 我创建了一个 Azure 应用服务,它使用 PHP,版本 7.3.26;
  2. 在 /home/site 内创建一个新的 oracle 目录;
  3. 将即时客户端添加到新的 oracle 目录中,在本例中为 Instant Client Linux x86-64 18.5.0.0.0v(基本包和 sdk 包);
  4. 继续使用命令pecl install oci8-2.2.0;
  5. 我在安装过程中指出了即时客户端的位置,oci8驱动安装成功;
  6. 将新的 oci8.so 文件复制到 /home/site 内的 ext 目录;
  7. 创建了一个php.ini文件,设置extension=/home/site/ext/oci8.so;
  8. 将 PHP_INI_SCAN_DIR 配置定义为 /usr/local/etc/php/conf.d:/home/site/ini;
  9. 将 LD_LIBRARY_PATH 定义为 /home/site/oracle/instantclient_18_5。

之后我可以确认我的 phpinfo() 页面上是否存在 oci8 扩展。

遵循本文档执行的步骤:Azure 应用服务 Linux - 添加 PHP 扩展

我后来也将 ORACLE_HOME 设置定义为 /home/site/oracle/instantclient_18_5,但没有区别。

我没有主意,有人可以告诉我可能导致此问题的原因以及如何解决它。


编辑:

与合作伙伴进一步交谈后,很明显,考虑到当前的配置,我无法连接到他们的数据库。正如 Christopher Jones 的评论所述,这是一个网络问题,ORA-12545、ORA-12541、ORA-12514 和 ORA-01017 – 如何修复 SQL Developer,在这种情况下,缺乏适当的解决方案反馈。

php oracle azure oci8
1个回答
0
投票

好的,

所以我为此奋斗了很长时间,无论我做什么,都无法永远让它找到tnsnames.ora文件。最后,我决定从 tnsnames.ora 文件中提取连接字符串定义,并将其作为连接字符串直接插入到 oci_connect 语句中,并且它起作用了:

//$connection_string = '(DESCRIPTION = (ADDRESS_LIST = (LOAD_BALANCE = ON)(FAILOVER = ON)(ADDRESS = (PROTOCOL = TCP)(HOST = HOST)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = SERVICE_NAME)))'
$connection_string = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.10)(PORT=1521))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME = pdb_mypdb.xyz.com)))';
$conn = oci_connect("mypdb", "mypdbpw", $connection_string );

更酷的是,在很多第三方程序中,当它们询问 oracle 服务器的名称时,您可以将整个 tnsnames.ora CONNECT 定义(如上面的 $connection_string 中)放入“服务器名称”,它将起作用。您甚至不需要 tnsnames.ora 等,所有负载平衡等都将起作用。

祝你好运, 大卫

© www.soinside.com 2019 - 2024. All rights reserved.