Azure Web 应用程序,PHP 7.4,OCI8(Oracle 即时客户端 12.2.0.1.0)
Azure Web App, PHP 7.4, OCI8 (Oracle Instant Client 12.2.0.1.0)
我们正在尝试将现有 PHP 7.4 应用程序从内部服务器 运行ning on Windows Server 2012 提升到 Azure Web 应用程序。 PHP 应用程序使用 OCI8 连接到 Oracle 数据库。在没有启用 OCI8 扩展的情况下,一切(除了数据库连接)都可以正常工作。
我们按照其他 Stack Overflow 问题中的建议遵循 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
原来这个问题是由于应用服务“Composer”扩展和 OCI8 之间的不兼容造成的。当我们启用它时,我会继续更新这个post,因为我假设其他人也会在某个时候运行进入这个。
更新 2021-08-16
作为最后一次更新,我们安装了旧版本的 Composer (1.6.4)。我们没有测试所有其他版本,但如果你 运行 遇到同一个问题,1.6.4 至少可以作为一个可靠的基线。
Azure Extension 的 repo 似乎没有指定版本,因此它应该获取最新版本,但似乎只安装了 1.8.5,因此某处可能有错误的缓存。 TL;DR:如果遇到问题,请尝试手动安装 Composer 而不是使用扩展。
我做了一些搜索,这个似乎是一个非常可靠且更新的答案:。
我认为您可能是对的,PHP 没有正确启动。几个问题:
- 您是否按照此处所述为站点配置并启用 PHP 错误日志记录:https://azureossd.github.io/2016/09/28/how-to-identifyreview-errors-on-php-applications-in-azure-web-apps-using-log-stream-service/
- 如果您在 /wwwroot/ 中创建一个包含
<?php phpinfo();
的 phpinfo.php 文件,并在问题发生时尝试访问它,oci8 驱动程序是否加载?
- 如果您在问题发生时创建并尝试访问 index.html 之类的静态文件,是否可以直接访问该文件?它将确认 PHP 问题。
- 你能用正确的屏幕截图检查 post 吗,也许这有助于更清楚地了解缺少的内容,上面引用的 link 删除了屏幕截图:https://azureossd.github.io/2016/02/23/access-oracle-databases-from-azure-web-apps-using-oci8-drivers-with-php/(我跟着这里的步骤对我有用)
我建立了一个实验室,这花了我一些功夫,但我确实做到了 运行 看起来是这样。我可以构建一个 Oracle 服务器并获取一些数据来证明它有效:
Driver output
我可能会按照上面的那些步骤,我相信它可以被弄清楚。它可能缺少以下步骤之一:
- 需要应用程序设置PHP_INI_SCAN_DIR
- 需要具有正确设置的 /site/ini/extensions.ini 文件,我使用了这个:
extension="D:\Program Files (x86)\PHP\v7.4\ext\php_oci8_12c.dll"
- 需要具有正确设置的 ApplicationHost.xdt
- 需要下载和上传 Oracle Instant Client 文件夹
我上传了 instantclient_19_11 但你也可以上传 instantclient_12_X
- 完成所有这些后重新启动并确认已加载 OCI8 驱动程序。在我完成所有这些操作之前,我一直看到类似的白色错误页面。
我们正在尝试将现有 PHP 7.4 应用程序从内部服务器 运行ning on Windows Server 2012 提升到 Azure Web 应用程序。 PHP 应用程序使用 OCI8 连接到 Oracle 数据库。在没有启用 OCI8 扩展的情况下,一切(除了数据库连接)都可以正常工作。
我们按照其他 Stack Overflow 问题中的建议遵循 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
原来这个问题是由于应用服务“Composer”扩展和 OCI8 之间的不兼容造成的。当我们启用它时,我会继续更新这个post,因为我假设其他人也会在某个时候运行进入这个。
更新 2021-08-16
作为最后一次更新,我们安装了旧版本的 Composer (1.6.4)。我们没有测试所有其他版本,但如果你 运行 遇到同一个问题,1.6.4 至少可以作为一个可靠的基线。
Azure Extension 的 repo 似乎没有指定版本,因此它应该获取最新版本,但似乎只安装了 1.8.5,因此某处可能有错误的缓存。 TL;DR:如果遇到问题,请尝试手动安装 Composer 而不是使用扩展。
我做了一些搜索,这个似乎是一个非常可靠且更新的答案:
我认为您可能是对的,PHP 没有正确启动。几个问题:
- 您是否按照此处所述为站点配置并启用 PHP 错误日志记录:https://azureossd.github.io/2016/09/28/how-to-identifyreview-errors-on-php-applications-in-azure-web-apps-using-log-stream-service/
- 如果您在 /wwwroot/ 中创建一个包含
<?php phpinfo();
的 phpinfo.php 文件,并在问题发生时尝试访问它,oci8 驱动程序是否加载? - 如果您在问题发生时创建并尝试访问 index.html 之类的静态文件,是否可以直接访问该文件?它将确认 PHP 问题。
- 你能用正确的屏幕截图检查 post 吗,也许这有助于更清楚地了解缺少的内容,上面引用的 link 删除了屏幕截图:https://azureossd.github.io/2016/02/23/access-oracle-databases-from-azure-web-apps-using-oci8-drivers-with-php/(我跟着这里的步骤对我有用)
我建立了一个实验室,这花了我一些功夫,但我确实做到了 运行 看起来是这样。我可以构建一个 Oracle 服务器并获取一些数据来证明它有效:
Driver output
我可能会按照上面的那些步骤,我相信它可以被弄清楚。它可能缺少以下步骤之一:
- 需要应用程序设置PHP_INI_SCAN_DIR
- 需要具有正确设置的 /site/ini/extensions.ini 文件,我使用了这个: extension="D:\Program Files (x86)\PHP\v7.4\ext\php_oci8_12c.dll"
- 需要具有正确设置的 ApplicationHost.xdt
- 需要下载和上传 Oracle Instant Client 文件夹 我上传了 instantclient_19_11 但你也可以上传 instantclient_12_X
- 完成所有这些后重新启动并确认已加载 OCI8 驱动程序。在我完成所有这些操作之前,我一直看到类似的白色错误页面。