使用oci_connect连接到Oracle

问题描述

我正在尝试使用PHP建立成功的Oracle连接。

这是我的连接字符串的外观:

<?PHP
   $conn = oci_connect("USER","PASS","LOSINGMINDHOST");
   if (!$conn) {
       $e = oci_error();
       error_log(trigger_error(htmlentities($e['message'],ENT_QUOTES),E_USER_ERROR));
   }

   oci_close($conn);
?>

出现以下错误

Warning: oci_connect(): ORA-12170: TNS:Connect timeout occurred

哪个指向带有oci_connect的行。

我正在使用Windows Server 2019。

PHP.ini文件已更新,包括以下内容

extension=oci8_12c

我已经确认上面的dll文件确实在ext文件夹中,列为:

PHP_oci8_12c.dll

不确定为什么PHP.ini文件不包含dll文件的全名。

服务器已安装了64位Ocale 12g即时客户端。

我们已经使用tnsnames.ora文件确认了使用ODBC Data Source Administrator客户端的连接。

我们还有一个listener.ora文件,如下所示:

PROD_MIR =
 (DESCRIPTION =
  (ADDRESS_LIST =
  (ADDRESS = (COMmunitY = ttp.world)(PROTOCOL = TTP)(Host = LOSINGMINDHOST)(Port = 1524))
  (ADDRESS = (COMmunitY = ttp.world)(PROTOCOL = TTP)(Host = LOSINGMINDHOST)(Port = 1551))
  (ADDRESS = (COMmunitY = ttp.world)(PROTOCOL = TTP)(Host = LOSINGMINDHOST)(Port = 1538))
)
(CONNECT_DATA =
  (SERVICE_NAME = PROD)
)
)

我们将TNS_ADMIN路径添加到服务器上的环境变量。

我们已经重新启动了服务,甚至重新启动了服务器。

解决方法

如文档(https://www.php.net/manual/en/function.oci-connect.php)所述:

oci_connect(字符串$ username,字符串$ password [,字符串$ connection_string [,字符串$ character_set [,int $ session_mode]]]):资源

connection_string 包含要连接的Oracle实例。它可以是»轻松连接字符串,或tnsnames.ora 文件中的连接名称,也可以是本地Oracle实例的名称。

这是您的情况,请使用正确的tnsnames.ora连接名称。