Azure Web 应用、PHP 7.4、OCI8Oracle Instant Client 12.2.0.1.0

问题描述

我们正在尝试将现有的 PHP 7.4 应用从运行在 Windows Server 2012 上的内部服务器提升到 Azure Web 应用。 PHP 应用程序使用 OCI8 连接到 Oracle 数据库。在没有启用 OCI8 扩展的情况下,一切(数据库连接除外)都可以正常工作。

我们已按照其他堆栈溢出问题中的建议遵循 https://docs.microsoft.com/en-us/archive/blogs/azureossds/access-oracle-databases-from-azure-web-apps-using-oci8-drivers-with-php 中的指南,但每当启用 OCI8 扩展时,我们都会遇到无日志 HTTP 500 错误

我们采取的步骤是:

  • 从禁用 OCI8 开始,应用加载正常,但无法运行任何数据库调用数据库调用错误记录在日志中。
  • 编辑 D:\home\site\ini\extensions.ini 文件以启用 OCI8(我们尝试了多种变体 - 完整路径、32 位、64 位、仅扩展名,例如 extension=PHP_oci8 - 所有变体都有相同的结果)。
  • 重启应用
  • 刷新页面 - 结果是状态代码 500,纯白色屏幕显示 The page cannot be displayed because an internal server error has occurred.
  • 检查 D:\home\LogFiles 下的所有内容包括 PHP_errors.log、eventlog.xml 和 /http/RawLogs。 eventlog.xml 显示服务器重启,之后没有其他记录。

我们还尝试使用 Azure 应用服务中的“应用服务日志”,并启用 Application Insights,但同样没有任何兴趣(我们可以在日志中看到 HTTP 500 响应,但没有任何关于什么的详细信息)造成的)。

怀疑是 PHP 没有启动,但当似乎没有记录任何内容时,我们不确定如何跟踪它。

最终,这导致了两个问题:

  • 是否有其他方法可以在 Azure 应用服务中启用日志,或者我可能缺少某个日志位置?
  • 是否有更新指南可用于在 Azure 应用服务上使用 OCI8 运行 PHP 应用?上面的指南已有 5 年以上的历史,至少其中列出的所有内容的版本似乎都已过时。我怀疑 Azure 应用服务的更新方式也可能会阻止我们。

谢谢!


更新 2021-08-10 (1)

原来这个问题是由于应用服务“Composer”扩展和 OCI8 之间的不兼容造成的。随着我们启用该功能,我将继续更新这篇文章,因为我认为其他人也会在某个时候遇到这个问题。

解决方法

我进行了一些搜索,这似乎是一个非常可靠且更新的答案:Does Azure PHP 7 web app have Oracle drivers?

我认为您可能是对的,PHP 没有正确启动。几个问题:

  1. 您是否像此处描​​述的那样为网站配置和启用 PHP 错误日志记录:https://azureossd.github.io/2016/09/28/how-to-identifyreview-errors-on-php-applications-in-azure-web-apps-using-log-stream-service/
  2. 如果您在 /wwwroot/ 中创建一个包含 <?php phpinfo(); 的 phpinfo.php 文件,并在问题发生时尝试访问它,是否会加载 oci8 驱动程序?
  3. 如果您在问题发生时创建并尝试访问 index.html 等静态文件,是否可以直接访问?它将确认 PHP 问题。
  4. 您能否使用正确的屏幕截图检查帖子,也许这将有助于更清楚缺少什么,上面引用的链接删除了屏幕截图:https://azureossd.github.io/2016/02/23/access-oracle-databases-from-azure-web-apps-using-oci8-drivers-with-php/(我按照此处的步骤操作到 T 并且它适用于我)

我建立了一个实验室,花了我一些工作,但我实际上让它运行了,看起来如此。我可以构建一个 Oracle 服务器并获取一些数据来证明它有效:

Driver output

我可能会按照上面的步骤进行操作,我相信它可以解决。它可能缺少以下步骤之一:

  1. 需要应用设置 PHP_INI_SCAN_DIR
  2. 需要具有正确设置的 /site/ini/extensions.ini 文件,我使用了这个: extension="D:\Program Files (x86)\PHP\v7.4\ext\php_oci8_12c.dll"
  3. 需要具有正确设置的 ApplicationHost.xdt
  4. 需要下载上传Oracle Instant Client文件夹 我上传了instantclient_19_11,但你也可以上传instantclient_12_X
  5. 在完成所有这些并确认已加载 OCI8 驱动程序后重新启动。我看到了一个类似的白色错误页面,直到所有这些都正确为止。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...