调用未定义函数 oci_connect、php_oci8_12c.dll、windows 8.1、php5.6.6
Call to undefined function oci_connect, php_oci8_12c.dll, windows 8.1, php5.6.6
我有一个简单的 php 脚本:
<?php
$db_user = 'myusername';
$db_pass = 'mypassword';
$db_sid = 'mysid';
$conn = oci_connect( $db_user, $db_pass, $db_sid );
?>
当我 运行 它(从浏览器或从命令行)时,我收到错误:
Call to undefined function oci_connect
我正在使用 php 5.6.6,其中 php_oci8_12c.dll 已经存在。
我的 php.ini
中有 extension=php_oci8_12c.dll
我已经安装了即时客户端 (12.1) - 尝试了 32 位版本和 64 位版本
我有 ORACLE_HOME 和 TNS_ADMIN 环境变量指向即时客户端文件夹 ( C:\instantclient_12_1 )。
我的路径中还有 C:\instantclient_12_1
我在同一个文件夹中有一个 tnsnames.ora,其中包含以下相关条目:
MYSID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = myhost.net)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MYSERVICE)
)
)
我还从 http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html
下载了 SQLDeveloper
SQLDeveloper 工作,识别上面提到的 tnsnames.ora 并连接并成功 运行 在我的 php 脚本试图访问的同一数据库上查询。
几天来我花了几个小时尝试不同的事情,但都无济于事。
我正在使用:
php 5.6.6
windows 8.1
IIS (so no answers involving apache please)
cmd (run as administrator)
Oracle Database 11g Enterprise Edition 11.2.0.3.0
其他一些可能有用的信息:
理想情况下,我想使用 oci 1.4.10 来匹配生产服务器,但现在不太担心。
pear install oci8-1.4.10.tgz
给我这个错误:
The DSP oci8.dsp does not exist
我找不到任何对我有意义的错误解释。
我错过了什么 - 谁能帮帮我
编辑:
我已经尝试了Whosebug上其他帖子中的各种建议,即:
extension=oci8.so
有无 extension=php_oci8_12c.dll
我的 php.ini 文件中没有行 extension=php_oracle.dll
编辑:
phpinfo 告诉我我正在使用正确的 php.ini 文件:
Loaded Configuration File => C:\php5.6.6\php.ini
来自 phpinfo 的这一行可能也有用:
Configure Command => cscript /nologo configure.js "--enable-snapshot-build" "--enable-debug-pack" "--disable-zts" "--disable-isapi" "--disable-nsapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-oci8-12c=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-enchant=shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--with-mcrypt=static" "--without-analyzer" "--with-pgo"
编辑:
似乎 dsp 文件是 VC++ 项目文件 - 我现在正在尝试学习如何创建 php 扩展,希望当我完成后我会有有足够的知识将 oci8 1.4.10 源代码编译成可在 windows 8 上运行的 dll - 除非有人用这个问题的答案来拯救我 - 这看起来需要我一些时间 :-)
编辑:
将 display_startup_errors = On
添加到 php.ini 告诉我 oci dll 不是有效的 Win32 应用程序
编辑: 嗯。在 Windows 8 上尝试此操作似乎会生成与您指定的相同的错误。我目前正在调查...
我的错误(我启用了错误的 extension_dir
行)。它在 Win8 中工作,如下所述。
以下步骤应该是让 OCI 使用 PHP 所需的全部步骤(我刚刚在新安装的 Windows 2008 R2 标准 x64 虚拟机上验证了这一点):
- 下载并解压缩 PHP(我使用
php-5.6.7-nts-Win32-VC11-x86.zip
中的 C:\php
)。
- 下载并解压 InstantClient(我使用
instantclient-basic-nt-12.1.0.2.0.zip
中的 C:\instantclient_12_1
)。
- 将以上路径加入系统路径
- 将
c:\php\php.ini-production
复制到c:\php\php.ini
。
- 在
php.ini
中:
- 启用线路
extension_dir = "ext"
.
- 启用线路
extension=php_oci8_12c.dll
.
- 安装 Microsoft Visual C++ 2010 运行时 (x86)。这是 OCI8 扩展所必需的。
- 安装 Microsoft Visual C++ 2012 运行时 (x86)。这是 PHP.
所需要的
此时 运行 php --ri oci8
在命令提示符中显示以下输出:
C:\>php --ri oci8
oci8
OCI8 Support => enabled
OCI8 DTrace Support => disabled
OCI8 Version => 2.0.9
Revision => $Id: f5a3ee1083d1ffa6adb5143efda6eafa210b8414 $
Oracle Run-time Client Library Version => 12.1.0.2.0
Oracle Compile-time Instant Client Version => 12.1
Directive => Local Value => Master Value
oci8.max_persistent => -1 => -1
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20
oci8.default_prefetch => 100 => 100
oci8.old_oci_close_semantics => Off => Off
oci8.connection_class => no value => no value
oci8.events => Off => Off
Statistics =>
Active Persistent Connections => 0
Active Connections => 0
并检查 oci_connect
函数:
C:\>php -r "var_dump(function_exists('oci_connect'));"
bool(true)
除了所说的解决问题之外,我想添加 php CLI 方面的内容,因为有些人需要 运行 CLI 模式下支持 OCI 的应用程序。在我的例子中,我必须将 oci.dll
的实例复制到 wamp/bin/php/php<version>/
文件夹中以显示 php --ri oci8
已正确加载 oci8。这并不能证明不需要其他文件来正确 运行 一个完整的应用程序(请参阅我的技术脚注)。
包括到 instantclient 12 分发的路径不会这样做。
技术说明:
我的环境是:Windows 7 + WAMP3(php 5.6.15,apache 2.4.17),经过多次实验,我能够缩小需要的三个文件的最小集合从 instantclient 12 分发版复制到 bin 目录(Apache 的非 cli 应用程序),以允许在 Zend Framework 中实例化 Oracle 适配器,执行 SQL 查询并读取记录集。
这组是:oci.dll
、oraociei12.dll
和orans.dll
。
特别是,仅复制 oci.dll
将不允许应用程序运行(引发未知异常)
我有一个简单的 php 脚本:
<?php
$db_user = 'myusername';
$db_pass = 'mypassword';
$db_sid = 'mysid';
$conn = oci_connect( $db_user, $db_pass, $db_sid );
?>
当我 运行 它(从浏览器或从命令行)时,我收到错误:
Call to undefined function oci_connect
我正在使用 php 5.6.6,其中 php_oci8_12c.dll 已经存在。
我的 php.ini
中有extension=php_oci8_12c.dll
我已经安装了即时客户端 (12.1) - 尝试了 32 位版本和 64 位版本
我有 ORACLE_HOME 和 TNS_ADMIN 环境变量指向即时客户端文件夹 ( C:\instantclient_12_1 )。
我的路径中还有 C:\instantclient_12_1
我在同一个文件夹中有一个 tnsnames.ora,其中包含以下相关条目:
MYSID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = myhost.net)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MYSERVICE)
)
)
我还从 http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html
下载了 SQLDeveloperSQLDeveloper 工作,识别上面提到的 tnsnames.ora 并连接并成功 运行 在我的 php 脚本试图访问的同一数据库上查询。
几天来我花了几个小时尝试不同的事情,但都无济于事。
我正在使用:
php 5.6.6
windows 8.1
IIS (so no answers involving apache please)
cmd (run as administrator)
Oracle Database 11g Enterprise Edition 11.2.0.3.0
其他一些可能有用的信息:
理想情况下,我想使用 oci 1.4.10 来匹配生产服务器,但现在不太担心。
pear install oci8-1.4.10.tgz
给我这个错误:
The DSP oci8.dsp does not exist
我找不到任何对我有意义的错误解释。
我错过了什么 - 谁能帮帮我
编辑:
我已经尝试了Whosebug上其他帖子中的各种建议,即:
extension=oci8.so
有无 extension=php_oci8_12c.dll
我的 php.ini 文件中没有行 extension=php_oracle.dll
编辑:
phpinfo 告诉我我正在使用正确的 php.ini 文件:
Loaded Configuration File => C:\php5.6.6\php.ini
来自 phpinfo 的这一行可能也有用:
Configure Command => cscript /nologo configure.js "--enable-snapshot-build" "--enable-debug-pack" "--disable-zts" "--disable-isapi" "--disable-nsapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-oci8-12c=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-enchant=shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--with-mcrypt=static" "--without-analyzer" "--with-pgo"
编辑:
似乎 dsp 文件是 VC++ 项目文件 - 我现在正在尝试学习如何创建 php 扩展,希望当我完成后我会有有足够的知识将 oci8 1.4.10 源代码编译成可在 windows 8 上运行的 dll - 除非有人用这个问题的答案来拯救我 - 这看起来需要我一些时间 :-)
编辑:
将 display_startup_errors = On
添加到 php.ini 告诉我 oci dll 不是有效的 Win32 应用程序
编辑: 嗯。在 Windows 8 上尝试此操作似乎会生成与您指定的相同的错误。我目前正在调查...
我的错误(我启用了错误的 extension_dir
行)。它在 Win8 中工作,如下所述。
以下步骤应该是让 OCI 使用 PHP 所需的全部步骤(我刚刚在新安装的 Windows 2008 R2 标准 x64 虚拟机上验证了这一点):
- 下载并解压缩 PHP(我使用
php-5.6.7-nts-Win32-VC11-x86.zip
中的C:\php
)。 - 下载并解压 InstantClient(我使用
instantclient-basic-nt-12.1.0.2.0.zip
中的C:\instantclient_12_1
)。 - 将以上路径加入系统路径
- 将
c:\php\php.ini-production
复制到c:\php\php.ini
。 - 在
php.ini
中:- 启用线路
extension_dir = "ext"
. - 启用线路
extension=php_oci8_12c.dll
.
- 启用线路
- 安装 Microsoft Visual C++ 2010 运行时 (x86)。这是 OCI8 扩展所必需的。
- 安装 Microsoft Visual C++ 2012 运行时 (x86)。这是 PHP. 所需要的
此时 运行 php --ri oci8
在命令提示符中显示以下输出:
C:\>php --ri oci8
oci8
OCI8 Support => enabled
OCI8 DTrace Support => disabled
OCI8 Version => 2.0.9
Revision => $Id: f5a3ee1083d1ffa6adb5143efda6eafa210b8414 $
Oracle Run-time Client Library Version => 12.1.0.2.0
Oracle Compile-time Instant Client Version => 12.1
Directive => Local Value => Master Value
oci8.max_persistent => -1 => -1
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20
oci8.default_prefetch => 100 => 100
oci8.old_oci_close_semantics => Off => Off
oci8.connection_class => no value => no value
oci8.events => Off => Off
Statistics =>
Active Persistent Connections => 0
Active Connections => 0
并检查 oci_connect
函数:
C:\>php -r "var_dump(function_exists('oci_connect'));"
bool(true)
除了所说的解决问题之外,我想添加 php CLI 方面的内容,因为有些人需要 运行 CLI 模式下支持 OCI 的应用程序。在我的例子中,我必须将 oci.dll
的实例复制到 wamp/bin/php/php<version>/
文件夹中以显示 php --ri oci8
已正确加载 oci8。这并不能证明不需要其他文件来正确 运行 一个完整的应用程序(请参阅我的技术脚注)。
包括到 instantclient 12 分发的路径不会这样做。
技术说明: 我的环境是:Windows 7 + WAMP3(php 5.6.15,apache 2.4.17),经过多次实验,我能够缩小需要的三个文件的最小集合从 instantclient 12 分发版复制到 bin 目录(Apache 的非 cli 应用程序),以允许在 Zend Framework 中实例化 Oracle 适配器,执行 SQL 查询并读取记录集。
这组是:oci.dll
、oraociei12.dll
和orans.dll
。
特别是,仅复制 oci.dll
将不允许应用程序运行(引发未知异常)