【问题标题】:PHP 7.2 - Missing extensions returns no errors - Stops executionPHP 7.2 - 缺少扩展不返回错误 - 停止执行
【发布时间】:2018-12-07 12:42:26
【问题描述】:

我从周三开始就一直在解决这个问题,我在 PHP 5.6 和 PHP 7.2(也是 7.1)之间的研究和测试后的结果是:我的 PHP 7 没有抱怨或注意到我的环境中缺少扩展。

取而代之的是,它只是停止执行而没有错误消息。

问题

为什么 PHP 7.x 会在脚本中间停止执行*,并且不再因缺少 PHP 扩展而触发错误通知或提示?

* 主要在函数需要使用特定 PHP-Extension 的位置。

环境

Operating System :  Debian GNU/Linux 9.6 (stretch)
Web Server       :  nginx/1.10.3
PHP              :  PHP 7.2.12

/etc/apt/sources.list

# deb cdrom:[Debian GNU/Linux 9.2.1 _Stretch_ - Official amd64 NETINST 20171013-13:07]/ stretch main

#deb cdrom:[Debian GNU/Linux 9.2.1 _Stretch_ - Official amd64 NETINST 20171013-13:07]/ stretch main

deb http://ftp.de.debian.org/debian/ stretch main
deb-src http://ftp.de.debian.org/debian/ stretch main

deb http://security.debian.org/debian-security stretch/updates main
deb-src http://security.debian.org/debian-security stretch/updates main

# stretch-updates, previously known as 'volatile'
deb http://ftp.de.debian.org/debian/ stretch-updates main
deb-src http://ftp.de.debian.org/debian/ stretch-updates main

问题

虽然 PHP 5.6 抱怨缺少驱动程序或无效函数,但它只是在我的代码中间必要时停止执行,而不会出现错误消息。

示例:如果其中一些扩展未安装,则会出现问题:

php7.2-mysql
php7.2-mbstring
php7.2-soap
php7.2-simplexml

这个问题真的很令人困惑,因为我在/etc/php/7.2/fpm/php.ini 中启用了错误报告和显示错误、启动错误,并且还使用...

ini_set('display_errors',1);
ini_set('display_startup_errors',1);
error_reporting( E_ALL | E_STRICT);

...在我的代码中。但是,仍然不会出现缺少扩展的消息或错误。

当函数调用缺少必要的扩展时,PHP 7.2 是否不再能够抛出错误?还是php.ini 的默认设置中存在一些错误配置?

我错过了什么?


20181210

解决方案

最后这是我自己的错,我让我的路由器脚本尝试/捕获异常和 Throwable 到一个变量中,但当时没有转储或调试它们。很抱歉打扰了

其他重要说明

为了确保我在这里的问题易于理解:对于大多数常见错误,例如函数拼写错误、语法错误、声明、要求、丢失文件,我可以获得错误通知和异常等等。但我在这里的问题是PHP 7.2 无法注意到缺少某些 php-extension,而是在页面或日志上提供一些反馈,它只是停在需要/应该需要 php-extension 的功能。

【问题讨论】:

    标签: php nginx php-extension php-7.2


    【解决方案1】:

    你试过error_reporting(-1)吗?

    error_reporting( E_ALL | E_STRICT) 似乎没有处理所有解析/语法错误。

    参见示例:

    编辑: 捕获错误/异常也很有用(参见 cmets)

    try {
         // Your code
    } catch(Throwable $e) {
        echo $e->getMessage();
    }
    

    您可以捕获 Error 或 Throwable(捕获异常和错误 (> PHP 5))

    【讨论】:

    • 你好,这是先设置的,我想E_ALL | E_STRICT 可以得到更多的结果。改回来了,但没有结果。
    • 好的,我建议在stackoverflow.com/questions/1053424/… 中尝试 Frank Forte 的回答(捕获异常)。 PHP 7 中的错误处理已更改...
    • 谢谢,这为我指明了正确的方向,让我发现,我“愚蠢”是如此聪明地尝试在我的 PSR 中的整个应用程序开始时捕获错误-路由器脚本,它不会将结果返回到变量或转储中。将错误捕获到变量中是个好主意,但如果你不转储/调试它,那就太愚蠢了。我现在为每个丢失的扩展名都收到错误。谢谢你们两个,很抱歉我花了这么多时间和麻烦。
    【解决方案2】:

    您是否正在使用 php-fpm 执行 php 7.2? php.ini 对 php-fpm 没有任何作用。在这种情况下,您需要更新 php-fpm.conf 文件。

    php-fpm 的正确行是:

    ; enable display of errors
    php_flag[display_errors] = on
    php_flag[display_startup_errors] = on
    

    【讨论】:

    • 不知道,但我可以发誓过去 php.ini 也有效。我已经添加了这些行,但没有更改/结果。 (重启php7.2-fpm)
    • @Sascha 尝试使用 php_admin_flag 而不是 php_flag。
    • 这很奇怪。您的配置文件中有 catch_workers_output = yes 吗?
    • 现在也试过了。但还是没有结果。这一次,我在从 netinstall.iso 重新安装新的 Debian 9.6 前后都试过了。 (没有选择包,手动安装 nginx、php-fpm、openssh 等)唯一再次包含的外部源是 php7.2 的 Sury-Repository。 但是我有一个重要提示,我可能忘记提及了:我仍然会收到错误,如果我做错了什么,我大多数时候都会收到通知或异常。但我的问题是,缺少的扩展不会触发错误。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2018-04-14
    • 2018-08-11
    • 1970-01-01
    • 2018-05-10
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多