如何调查在没有 stdout/stderr 输出的 Azure 应用服务中启动时 php.exe 崩溃的情况?

如何调查在没有 stdout/stderr 输出的 Azure 应用服务中启动时 php.exe 崩溃的情况?

我正在尝试在运行 WordPress 的 Azure App Service 实例上安装 ImageMagick。Azure App Service 正在运行 PHP 7.3.3 x64,否则一切正常。

  1. 我访问了这个网页来获取正确的 zip 文件下载:https://mlocati.github.io/articles/php-windows-imagick.html
  2. phpinfo()说我正在运行x64 MSVC15非线程安全的 PHP 7.3.3,所以我下载了:
    • php_imagick-3.4.3-7.3-nts-vc15-x64.zip
    • ImageMagick-7.0.7-11-vc15-x64.zip
  3. 我将这两个 zip 文件解压到目录中各自的子目录中D:\home\site\ext
  4. 我在 创建了一个空文件D:\home\site\ext\extensions.ini
  5. 在 Azure App Service 配置区域,我添加了环境变量PHP_INI_SCAN_DIR=D:\home\site\ext\
  6. 我在其中extensions.ini输入了以下一行:extension=D:\home\site\ext\php_imagick-3.4.3-7.3-nts-vc15-x64\php_imagick.dll
  7. 然后我重新启动了 Azure 应用服务。从那时起,PHP 在启动时立即崩溃。
  8. 为了调查,我打开了 Kudu 并从目录运行了 PHP 命令行界面wwwroot

    cd D:\home\site\wwwroot\
    php -f phpinfo.php
    
    • 这会导致 PHP 立即崩溃。它不会向标准输出写入任何内容stderr(因此运行时php -f phpinfo.php > out.txt 2> err.txt会返回零字节文件out.txterr.txt)。
    • 我的全球php.ini已经有display_errors = Ondisplay_startup_errors = On
  9. 除了 FastCGI 扩展意外退出之外,Azure 中没有任何地方记录任何内容。
  10. 注释掉该#extension=D:\home\site\ext...行之后,PHP 运行正常。

我假设这可能是缺少系统依赖项(例如 VisualC++ Redistributables)的问题,但 Azure 声称所有当前的 VisualC++ Redistributables 都已预先安装(而且我们无论如何都无法安装自己的)。

有没有什么办法可以调查启动时进程崩溃的问题?

我知道一个选项是 WinDbg,但我不知道如何在 Azure App Service 中获取崩溃转储。

相关内容