我们正在尝试将现有的 PHP 7.4 应用程序从 Windows Server 2012 上运行的内部服务器提升到 Azure Web 应用程序。 PHP 应用程序使用 OCI8 连接到 Oracle 数据库。在不启用 OCI8 扩展的情况下,一切(数据库连接除外)都可以正常工作。
我们已按照指南进行操作https://learn.microsoft.com/en-us/archive/blogs/azureossds/access-oracle-databases-from-azure-web-apps-using-oci8-drivers-with-php https://learn.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 应用服务的更新方式也可能会阻止我们。
Thanks!
更新2021-08-10
事实证明,此问题是由于应用服务“Composer”扩展与 OCI8 之间不兼容造成的。当我们启用该功能时,我将继续更新这篇文章的进展,因为我认为其他人也会在某个时候遇到这个问题。
更新2021-08-16
作为最后的更新,我们最终安装了旧版本的 Composer (1.6.4)。我们没有测试所有其他版本,但如果您遇到同样的问题,1.6.4 至少可以作为可靠的基准。
Azure 扩展的存储库似乎没有指定版本,因此它应该获取最新版本,但似乎只安装了 1.8.5,因此某处可能存在损坏的缓存。 TL;DR:如果遇到问题,请尝试手动安装 Composer,而不是使用扩展。
我做了一些搜索,这似乎是一个相当可靠且更新的答案:Azure PHP 7 Web 应用程序是否有 Oracle 驱动程序? https://stackoverflow.com/questions/59970166/does-azure-php-7-web-app-have-oracle-drivers.
我认为 PHP 未正确启动这一点可能是对的。几个问题:
- 您是否按照此处所述配置并打开了站点的 PHP 错误日志记录:https://azureossd.github.io/2016/09/28/how-to-identifyreview-errors-on-php-applications-in-azure-web-apps-using-log-stream-service/ https://azureossd.github.io/2016/09/28/how-to-identifyreview-errors-on-php-applications-in-azure-web-apps-using-log-stream-service/
- 如果您在 /wwwroot/ 中创建一个 phpinfo.php 文件,其中包含
<?php phpinfo();
,并尝试在问题发生时访问它,oci8 驱动程序是否加载?
- 如果您在问题发生时创建并尝试访问像index.html这样的静态文件,可以直接访问吗?它将确认 PHP 问题。
- 您可以使用正确的屏幕截图检查帖子吗,也许这会帮助您更清楚地了解缺少的内容,上面引用的链接会删除屏幕截图:https://azureossd.github.io/2016/02/23/access-oracle-databases-from-azure-web-apps-using-oci8-drivers-with-php/ https://azureossd.github.io/2016/02/23/access-oracle-databases-from-azure-web-apps-using-oci8-drivers-with-php/(我按照这里的步骤进行操作,它对我有用)
我建立了一个实验室,花了我一些工作,但我实际上让它运行起来,看起来是这样。我可以构建一个 Oracle 服务器并获取一些数据来证明它有效:
驱动器输出 https://i.stack.imgur.com/g1guz.png
我可能会按照上面的步骤操作,并且我相信它可以解决。它可能缺少以下步骤之一:
- 需要应用程序设置 PHP_INI_SCAN_DIR
- 需要具有正确设置的 /site/ini/extensions.ini 文件,我使用了这个:
扩展名=“D:\ Program Files(x86)\ PHP \ v7.4 \ ext \ php_oci8_12c.dll”
- 需要具有正确设置的 ApplicationHost.xdt
- 需要下载并上传Oracle Instant Client文件夹
我上传了 instantclient_19_11,但您也可以上传 instantclient_12_X
- 完成所有这些后重新启动并确认 OCI8 驱动程序已加载。在我正确设置所有这些之前,我看到了类似的白色错误页面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)