【问题标题】:Connecting to Oracle 11gR2 XE on Ubuntu 13 server via PHP通过 PHP 连接到 Ubuntu 13 服务器上的 Oracle 11gR2 XE
【发布时间】:2013-07-18 18:51:45
【问题描述】:

我正在尝试通过 PHP 从网络中的另一台计算机连接到 Ubuntu 13 服务器上的 Oracle 11gR2 Xe。 我正在使用来自oci_connect 的安装和示例,如下所示:

<?php
query_cities();
function query_cities() {
if {
$c = oci_connect("hr", "hr", "localhost:1521/XE");
;
} else {
echo "No connection"; } 
?>

或另一个例子:

$c = oci_connect("hr", "hr", "192.168.1.33:1521/XE");

我已经通过 SqlPlus 在 DB 中启用了远程连接

SQL> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);

我已经解锁了用户 HR

SQL> ALTER USER hr ACCOUNT UNLOCK;

但我只能通过 SQL Developer 在网络上找到一些通过 IPv6 的连接,例如 netstat:

tcp6 0 0 192.168.1.33:1521 192.168.1.2:57563 ESTABLISHED 14843/oracleXE

tcp6 0 0 192.168.1.33:1521 192.168.1.2:59314 ESTABLISHED 15665/oracleXE

不是来自我的浏览器,它们不在 tcp IPv4 上。浏览器窗口保持白色.. 无反应、无响应且无错误消息。 这应该是由于 TNSLR IP 仅在 IPv6 上有效还是没有 oci_connect 公式足够好,或者我缺少其他一些?

我将不胜感激有关此问题的任何帮助

【问题讨论】:

  • 不要在浏览器窗口中测试。默认情况下,所有错误都将导致空白页。您必须返回错误日志才能查看错误。这就是您所看到的 - 错误在错误日志中。我预计是您没有在 PHP 中安装或启用 oci8。
  • 我很困惑地看到来自 netstat 的 tcp6 连接与 IPv4 地址。什么时候发生?
  • 关于 IPv6 的接口是: eth0 Link encap:Ethernet HWaddr 1c:6f:65:d8:7d:b7 inet addr:192.168.1.33 Bcast:192.168.1.255 Mask:255.255.25 inet6 addr: fe80::1e6f:65ff:fed8:7db7/64 范围:链接 UP BROADCAST RUNNING MULTICAST MTU:1500 指标:1 RX 数据包:1096637 错误:0 丢弃:259 超限:0 帧:0 TX 数据包:70353 错误:0 丢弃: 0 超限:0 载波:0 冲突:0 txqueuelen:1000 RX 字节:172696685 (172.6 MB) TX 字节:14938460 (14.9 MB),端口是这样的
  • netstat -tupan 活动 Internet 连接(服务器和已建立) tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 904/mysqld tcp 0 0 127.0.0.1:55948 127.0.1.1:1521 ESTABLISHED 9152/xe_pmon_X tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1260/java tcp6 0 0 :::8009 :::* LISTEN 1260/java tcp6 0 0 :::8080 :::* LISTEN 8947/tnslsnr tcp6 0 0 :::80 :::* LISTEN 7900/apache2 tcp6 0 0 :::1521 :::* LISTEN 8947/tnslsnr tcp6 0 0 :::8081 :::* LISTEN 1260/java tcp6 0 0 ::: 22 :::* LISTEN 884/sshd tcp6 0 0 :::443 :::* LISTEN 7900/apache2 tcp6 0 0 127.0.1.1:1521 127.0.0.1:55948 已建立 8947/tnslsnr
  • 我明白日志的意思,它们看起来像这样的错误:[error] [client 192.168.1.10] PHP Warning: oci_connect(): OCIEnvNlsCreate() failed。您的系统有问题 - 请检查 ORACLE_HOME 和 LD_LIBRARY_PATH 是否已设置并指向正确的目录

标签: php oracle ipv6 ubuntu-server


【解决方案1】:

好的,根据收到的在日志中查找错误的建议,我发现消息“*您的系统有问题 - 请检查 ORACLE_HOME 和 LD_LIBRARY_PATH 是否已设置并指向正确的目录*”我决定在st-curriculum.oracle 的模型之后通过安装Oracle InstantClient 并重新安装OCI8 包的复杂过程 - 进行非常小的修改,如下所示:

  1. Oracle 11g R2 XE 数据库和 Apache2 / PHP 服务器已预先安装在 Ubuntu 13.10 服务器和系统上(带有 prereqiuzite、交换文件、内核参数、内存泄漏错误恢复、库和 chkconfig 模拟器),如所述在许多帖子中。

  2. 我停止了 apache2 服务器

     service apache2 stop
    

    并在 st-curriculum.oracle.com 中启动 DRCP 连接池

  3. 我创建了一个名为 PHPHOL 的用户(如果还没有在 oracle 安装中完成,则替代安装 Oracle 的示例 HR 模式)

  4. 接下来,我从 OTN 下载了 Basic 和 SDK Instant Client 软件包:oracle.com/technetwork/database/features/instant-client/index-100365.html 并将软件包解压缩到 $ORACLE_HOME, (/u01 /app/oracle/product/11.2.0/xe)

  5. 然后我从 pecl.php.net/package/oci8 下载了 OCI8 包并作为 Instantclient 安装在 /opt/oci8 中

    phpise
    ./configure --with-oci8=instantclient,/u01/app/oracle/product/11.2.0/xe/instantclient_11_2
    make / make install
    
  6. 我设置oracle环境路径为oracle technote

    export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe        
    LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/xe/instantclient_11_2
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH=/opt/oci8/modules
    
    nano /etc/ld.so.conf.d/oracle.conf
    

    并插入:/u01/app/oracle/product/11.2.0/xe/instantclient_11_2

    nano /etc/ld.so.conf.d/oci8.conf
    

    并插入:/opt/oci8/modules

    nano /etc/ld.so.conf.d/shared.conf
    

    并插入已安装的共享扩展位置:/usr/lib/php5/20121212

    ldconfig
    
  7. 接下来我编辑了配置文件 php.ini 以添加:extension=oci8.so,设置 date.timezone 指令并还添加了 OCI8 1.4 扩展类:oci8.connection_class= MYPHPAPP(用于 st-curriculum .oracle.com 示例,请参见上面的链接)

  8. 我创建了链接:$ORACLE_HOME/instantclient_11_2/libclntsh.so.11.1。指向 $ORACLE_HOME/instantclient_11_2/libclntsh.so

  9. 在 Ubuntu 13.10 服务器上重启 Oracle 数据库和 Apache 服务

    /etc/init.d/oracle-xe force-reload
    service apache2 start
    
  10. 我在 phpinfo() 中验证了 oci8 已启用,我将 connect.php 文件设为:

    $conn = oci_connect("hr", "hr", "localhost/xe");
    

或者像来自 st-curriculum.oracle.com 的例子。

从同一网络上的另一台计算机,我通过浏览器连接到 Ubuntu 服务器上的 oracle 数据库,我得到了

已连接到 Oracle!

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 2017-12-08
    • 1970-01-01
    • 2011-05-21
    • 2014-12-02
    • 1970-01-01
    • 2018-08-02
    • 2012-01-04
    • 2015-11-19
    相关资源
    最近更新 更多