【问题标题】:Use of undefined constant OCI_CRED_EXT - assumed 'OCI_CRED_EXT' laravel使用未定义的常量 OCI_CRED_EXT - 假定为 'OCI_CRED_EXT' laravel
【发布时间】:2019-09-30 00:42:26
【问题描述】:

我正在尝试使用此包将 oracle 数据库连接到我的 laravel 应用程序:https://github.com/yajra/laravel-oci8 但外部连接出错,这是错误:

这里是包中的错误行:https://github.com/yajra/laravel-oci8/blob/5.8/src/Oci8/Connectors/OracleConnector.php#L35

系统详情

  • 操作系统:macOS Mojave Version 10.14.4 (18E226)
  • PHP 版本:7.3
  • Laravel 版本:5.8.*
  • Laravel-OCI8 版本:5.8.*

有人可以帮帮我吗?

【问题讨论】:

    标签: php laravel oracle oracle-call-interface yajra-datatable


    【解决方案1】:

    您的 OCI8 扩展的预定义常量似乎丢失了。确保 OCI8 扩展是

    1. 正确编译成PHP(见https://www.orware.com/blog/tips-and-how-tos/oracle/oracle-oci8-php-installation

    2. 在运行时动态加载。您可以在脚本中检查这一点,此处显示了如何执行此操作的示例:https://www.sitepoint.com/php-extension-not-loaded/

    【讨论】:

    • 我已经安装了oracle扩展和相关的东西。
    • 验证是否使用 phpinfo() 加载了 OCI8 扩展。如果已加载但仍无法正常工作,请尝试在运行时使用 dl() 函数加载模块,例如 php.net/manual/en/function.dl.php
    • 要添加到此答案中,有问题的错误可能是由于未在有效环境中定义所需的 Instant Client 环境变量(例如,ORACLE_HOME 和/或LD_LIBRARY_PATH)或@ 987654326@ 扩展未在有效的 INI 配置中启用(即,您在错误的 .ini 文件中启用了扩展)。正如建议的那样,使用phpinfo() 是确认所需环境变量已设置以及在给定操作环境(PHP-FPM vs. PHP-CLI vs. phpdbg 等)下哪个.ini 有效的最佳方式。 )。
    【解决方案2】:

    令人沮丧的是,关于如何进行此安装的教程很少,这导致在新服务器上安装此程序时很多人头疼。

    所以,这里有一个关于如何在 ubuntu 20.04 服务器上安装它的简要说明。

    编辑:我没有 Mac……
    ...但命令应该非常相似。至少,一个快速的谷歌会找到一些关于安装先决条件的教程。
    您可能还需要弄清楚不同的 php 安装位置(/etc/php 用于 linux)
    以下是有关其中一些详细信息的 php 扩展安装教程:https://affinitybridge.com/blog/adding-php-extensions-system-php-under-os-x-1015-catalina

    请注意,您可能使用不同的 Instantclient 和 PHP 版本

    先决条件:

    apt-get install unzip php-pear php7.4-dev
    
    1. 从 oracle 下载 Instantclient。 https://www.oracle.com/database/technologies/instant-client/downloads.html。您正在为您的系统/版本寻找“基本”和“sdk”下载
    2. 将它们解压缩到一个目录中。我正在使用 /opt/oracle。
      unzip /instantclient-basic.zip -d /opt/oracle
      unzip /instantclient-sdk.zip -d /opt/oracle 
      
    3. 符号链接库
      ln -s /opt/oracle/instantclient_11_2/libclntsh.so.11.1 /opt/oracle/instantclient_11_2/libclntsh.so
      ln -s /opt/oracle/instantclient_11_2/libocci.so.11.1 /opt/oracle/instantclient_11_2/libocci.so 
      
    4. 确保 oci.ini 文件存在于 mods-available 目录中
      echo 'extension=oci8.so' > /etc/php/7.4/mods-available/oci.ini
      
    5. 符号链接扩展文件。
      ln -s /etc/php/7.4/mods-available/oci.ini /etc/php/7.4/cli/conf.d/10-oci8.ini
      ln -s /etc/php/7.4/mods-available/oci.ini /etc/php/7.4/fpm/conf.d/10-oci8.ini 
      
    6. 定义所需的环境变量
      ORACLE_HOME=/opt/oracle/instantclient_11_2/
      LD_LIBRARY_PATH=/opt/oracle/instantclient_11_2/
      
    7. 安装扩展
      echo "instantclient,$ORACLE_HOME" | pecl install oci8-2.2.0
      
    8. 确保 ld 了解 oracle
      echo $ORACLE_HOME > /etc/ld.so.conf.d/oracle-instantclient.conf
      ldconfig
      
    9. 清理
      rm -rf /instantclient-*.zip \
      

    我一直挂断的问题与仅设置 php cli 或 php fpm 的扩展名有关,而不是两者兼而有之。如果你没有同时设置,你会在某处看到 OCI 常量错误。

    所以,不要跳过第 5 步。;)

    PS 如果你发现自己对某些事情感到困惑,让我们一起努力并更新这个答案,这样我们就可以更高兴地安装这个扩展。

    【讨论】:

      【解决方案3】:

      在您的 php.ini 文件中找到并取消注释以下行。

      extension=oci8_12c
      

      然后,重新启动您的网络服务器。和/或 PHP 容器 - 如果您使用的是一个,例如php-fpm,hhvm。

      然后,通过运行 <?php phpinfo(); ?> 或在 CLI > php -m 来检查扩展是否已加载

      如果扩展没有加载,请在PATH环境变量中设置Oracle客户端主目录,然后重试。

      如果您使用的是 Windows,如果上述方法均无效,请尝试重新启动 Windows。

      【讨论】:

        猜你喜欢
        • 2021-09-23
        • 2015-07-11
        • 2014-05-07
        • 2014-04-30
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多