【问题标题】:PHP Catchable Fatal Error - on serverPHP 可捕获的致命错误 - 在服务器上
【发布时间】:2016-01-19 15:23:38
【问题描述】:

目前面临一个新的 Silex (Symfony) PHP 应用程序的问题。如果我像php -S localhost:8080 一样在本地启动它,一切都会立即正常运行。上传到服务器后,我直接得到一个 500 Internal Server Error 和以下日志输出:

[Tue Jan 19 16:15:24 2016] [error] [client 62.99.210.9] PHP Catchable fatal error:
Argument 2 passed to Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent::
__construct() must be an instance of Symfony\\Component\\HttpKernel\\Event\\callable,
instance of Closure given, called in /appl/www/htdocs/XXX/static/dashboard/php/
vendor/symfony/http-kernel/HttpKernel.php on line 131 and defined in /appl/www/htdocs/XXX/static/dashboard/php/
vendor/symfony/http-kernel/Event/FilterControllerEvent.php on line 35

composer.json:

{
    "require": {
        "silex/silex": "~1.2",
        "twig/twig"  : "1.*",
        "symfony/twig-bridge": "2.1.*"
    },
    "minimum-stability": "dev",
    "config": {
        "vendor-dir": "php/vendor"
    }
}

感谢您对导致此类错误的原因的任何想法。

PHP 版本:PHP 5.3.3 (cli)(构建时间:2014 年 10 月 23 日 06:58:46)

【问题讨论】:

  • 你在本地和服务器上安装了什么版本的php?
  • PHP 5.3.3 (cli)(构建时间:2014 年 10 月 23 日 06:58:46)

标签: php apache symfony composer-php silex


【解决方案1】:

可调用类型提示从 PHP 5.4 开始提供

从 PHP 5.4 开始,回调可以用可调用类型提示来表示。这个 文档将回调类型信息用于相同目的。

http://php.net/manual/en/language.types.callable.php

这里发生的事情是 PHP 尝试将类型提示“可调用”解析为类名,并且由于没有提供命名空间,它会查找显然不存在的类“Symfony\Component\HttpKernel\Event\callable”。

【讨论】:

  • 当然,顺便说一句:您可能已经知道,但对于后代:如果您无法更改服务器上的 PHP 版本,您可以在 composer 中限制所需的 PHP 版本。
  • 如何使用 composer 限制需要一个 PHP 版本?
  • 例如使用"php" : "5.3"。它不会将你的包降级到与特定版本的 PHP 兼容的版本,但会强制使用适当的开发环境。这是一种有点肮脏的方法(我宁愿作曲家使用正确版本的包,而不是阻止你在从来没有版本的 PHP 上安装它们)但这是除了分别为每个包设置正确版本之外的唯一方法。
  • 好的,这仅用于开发目的 - 所以我可以确定我的开发堆栈也可以在服务器上运行。它不允许我“隐藏升级”PHP?除了在服务器上更新 PHP 以运行应用程序之外,还有其他方法吗?
  • 确保您的开发环境完美地反映生产的问题并不是那么微不足道。在您的情况下,您有旧版本的 PHP,我假设它没有在完全由您管理的实例上运行。幸运的是,升级 PHP 不会破坏您的代码(升级到 PHP7 可能会有风险,但也很容易提前测试)。如果您有 composer.lock 文件并且不在生产环境中使用 composer update 命令,则在本地环境的锁定文件中设置的所有依赖项都将保留在生产环境中,只需使用 composer install
【解决方案2】:

我使用的是 php 5.3.9,我也有同样的问题 Silex 在 1.3.3+ 版本安装 HttpKernel 使用 PHP 5.4+ 功能。

我的解决方案是使用 Silex 1.3.2。所有依赖项都使用 PHP 5.3.x 我不使用需要 PHP 5.3,因为作曲家需要 5.4 才能工作。

最简单的方法是更新 php 版本,但我无法更新服务器。你知道的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多