PHP连Oracle必须用oci8扩展,pdo_oci已废弃;需先安装匹配的Oracle Instant Client并配置环境变量;php.ini中启用oci8.so、设置oci8.default_prefetch等参数;连接用Easy Connect格式//host:port/SERVICE_NAME;执行SQL须oci_parse+oci_execute,绑定变量防注入。

PHP 连 Oracle 数据库,核心就一条路:必须用 oci8 扩展,pdo_oci 在 PHP 7.4+ 已废弃,装了也白装,报 Driver not found 或编译失败都是它导致的。
oci8 扩展安装前必须配好 Oracle Instant Client
没这个客户端,pecl install oci8 必然失败,常见报错是 undefined symbol: OCINlsGetInfo 或静默返回 false——这不是 PHP 的问题,是运行时根本找不到 Oracle 库。
- 下载匹配系统架构的
oracle-instantclient-basic和oracle-instantclient-devel(RPM)或basic.zip+devel.zip(ZIP),例如instantclient_21_12 - 解压到统一路径,推荐
/opt/oracle/instantclient_21_12 - 设环境变量:
export ORACLE_HOME=/opt/oracle/instantclient_21_12,export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_12:$LD_LIBRARY_PATH - 执行
ldconfig -p | grep oci,能看到libclntsh.so才算真正就位;若无,检查路径拼写、目录权限(需可读可执行)、是否漏掉ldconfig刷新
php.ini 里漏一项配置,oci_connect() 就会静默失败
oci_connect() 返回 false 却不报错?大概率是 php.ini 没生效。默认情况下连 oci_error() 都捕获不到真实错误。
- 确认已启用:
extension=oci8.so(Linux)或extension=php_oci8.dll(Windows) - 必须设置:
oci8.default_prefetch = 100(防大结果集卡死),oci8.connection_class = "WEB"(方便后续启用 DRCP) - 调试必开:
oci8.events = On——否则oci_error()拿不到ORA-12514这类关键信息 - 验证方式:
php --ri oci8输出中应含OCI8 Support => enabled,且版本与 PHP 匹配
oci_connect() 连接字符串填错,90% 的 ORA-12154 / ORA-12514 都源于此
别碰 tnsnames.ora,直接用 Easy Connect 格式最稳:
立即学习“PHP免费学习笔记(深入)”;
- 服务名(SERVICE_NAME)优先,不是 SID;查法:
SELECT value FROM v$parameter WHERE name = 'service_names' - 正确格式:
//192.168.1.100:1521/ORCLPDB1(注意双斜杠开头、端口后是斜杠、最后是服务名) - 若填成
//192.168.1.100:1521/ORCL(SID),在 Oracle 12c+ 多租户环境下大概率报ORA-12514 - 字符集建议显式传参:
oci_connect($user, $pass, $conn_str, 'AL32UTF8'),避免依赖NLS_LANG环境变量
执行 SQL 前必须 oci_parse() + oci_execute() 两步走
Oracle 不像 MySQL 有 mysqli_query() 一步到位。跳过 oci_parse() 直接 oci_execute(),会报 ORA-01008: not all variables bound 或直接失败。
- 所有查询必须先
$stmt = oci_parse($conn, $sql),再oci_execute($stmt) - 绑定变量要用
oci_bind_by_name(),不能靠字符串拼接,否则有 SQL 注入风险 - 查询结果用
oci_fetch_array($stmt, OCI_ASSOC)取,注意OCI_ASSOC参数控制键名大小写
最常被忽略的是 oci8.events = On 这个开关——不开它,连接失败时你看到的永远是空数组或 false,而不是真实的 ORA 错误码,排查成本翻倍。



















