我有一个简单的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
我无法找到有关该错误的任何解释,这对我来说意味着什么。
我错过了什么 - 任何人都可以帮助我
编辑:
我在stackoverflow上的其他帖子中尝试了各种建议,即:
带有和不带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应用程序
答案 0 :(得分:11)
编辑: 嗯。在Windows 8上尝试此操作似乎会生成与您指定的相同的错误。我正在调查......
我的错误(我启用了错误的extension_dir
行)。它在Win8中工作,如下所述。
以下步骤应该是让OCI使用PHP所需的全部内容(我刚刚在新安装的Windows 2008 R2 Standard x64虚拟机上验证了这一点):
C:\php
中的php-5.6.7-nts-Win32-VC11-x86.zip
)。C:\instantclient_12_1
中的instantclient-basic-nt-12.1.0.2.0.zip
)。c:\php\php.ini-production
复制到c:\php\php.ini
。php.ini
中:
extension_dir = "ext"
。extension=php_oci8_12c.dll
。此时在命令提示符下运行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)
答案 1 :(得分:2)
除了解决问题之外,我还想添加 php CLI 方面,因为有些人需要在CLI模式下运行支持OCI的应用程序。就我而言,我必须将oci.dll
的实例复制到wamp/bin/php/php<version>/
的{{1}}文件夹中,以显示oci8已正确加载。这并不能证明正确运行完整的应用程序不需要其他文件(参见我的技术脚注)。
包括即时客户端12分发的路径不会这样做。
技术说明: 我的环境是:Windows 7 + WAMP3(php 5.6.15,apache 2.4.17),在经过多次实验后,我能够缩小需要复制到bin目录的三个文件的最小集合(Apache的对于来自instantclient 12发行版的非cli应用程序,允许在Zend Framework中实例化Oracle适配器,执行SQL查询并读取记录集。
此设置为:php --ri oci8
,oci.dll
和oraociei12.dll
。
特别是,仅复制orans.dll
将不允许应用程序工作(未知异常引发)