【问题标题】:Symfony 2.2.1 fatal error on remote server (only)-why?远程服务器上的 Symfony 2.2.1 致命错误(仅限)-为什么?
【发布时间】:2013-05-23 10:28:23
【问题描述】:

this question 中提到的 Symfony 代码库上,安装 FOSUserBundle 后,它可以在本地运行,但在远程服务器上它甚至无法启动,给出 HTTP 500 错误页面。

编辑:灾难似乎发生在app_dev.php的以下行:

$kernel = new AppKernel('dev', true);

在远程服务器上出现如下错误:

Fatal error: Class 'Symfony\Component\HttpFoundation\Request' not found in [docroot]/web/app.php on line 22

或- 在删除文档根目录下的所有内容后,更新(composer updatecomposer update -o,根据 this answer),然后部署:

Fatal error: Cannot redeclare class 
Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage in
[docroot]/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php
on line 25

我清除了 Symfony 缓存,删除了 app/cache/devapp/cache/prod/ 目录,但没有运气。

我不明白的另一件事:远程上的app/console cache:clear 给出了这个错误:

Fatal error: Cannot redeclare class 
EnhancedProxy_72114c0f8683bcc2a66ceccb136abe5a78f8577e\__CG__\Acme\DemoBundle\Controller\SecuredController
in [docroot]/app/cache/de_/jms_diextra/proxies/Acme-DemoBundle-Controller-SecuredController.php
on line 28

顺便说一句,为什么要创建目录app/cache/de_(除了devprod)?

为了完整起见,你可以找到我的composer.jsonhere

可能是什么问题?本地和远程平台不同,但错误似乎与代码有关,而不是服务器配置。

本地机器:

  • Windows 7
  • Zend 服务器 CE
  • Apache 2.2
  • PHP 5.3.14(apache 模块)
  • MySQL 5.1
  • APC

远程机器:

  • Ubuntu 12.04
  • Apache 2.2
  • PHP 5.3.10 fpm (fastcgi)
  • MySQL 5.5
  • APC

有什么建议吗?甚至如何调试这个?我开始考虑放弃 Symfony :(

【问题讨论】:

  • 请提供您的 composer.json。你在使用 APC/ApcUniversalClassloader 吗?
  • 好像漏掉了一些 symfony2 组件...
  • @nifr 如何检查我是否有 ApcUniversalClassloader?从与供应商的标准安装中,我刚刚添加了 FOSUserBundle。
  • @PaoloStefan:您是否将整个应用程序文件夹从本地“复制”到远程?
  • @PaoloStefan:我在部署时从未遇到过类似的问题。但是,我明确删除了缓存文件夹(在部署中)

标签: symfony cygwin fosuserbundle composer-php


【解决方案1】:

您的开发和生产服务器上有不同版本的供应商的可能原因。然后你运行命令composer update 你更新你拥有的所有供应商。有时它可以使一切崩溃。出于这个原因,有一个命令 composer install 检查您的 composer.lock 文件并安装您那里的版本。

如果您只需要更新一个包,您可以运行composer update bundle_name。此操作会更新您的供应商文件夹并更新 composer.lock 文件。

您可以查看symfony-standard 存储库,它有composer.lock 文件。每次更新供应商时,您都必须上传该文件的新版本,以使所有供应商保持相同的版本。同样的故事,然后您部署您的应用程序。

您可以在official documentation 中阅读有关composer.lock 文件的更多信息。

所以,尝试删除整个 vendor/ 文件夹,然后复制到远程服务器 composer.lock 文件,输入php composer.phar install

【讨论】:

    【解决方案2】:

    可能的解决方案是

    1. Composer 未完成(使用composer update 会占用大量资源,因此请始终在远程环境中使用锁定文件中的composer install)。您应该从本地开发环境中放置最新的锁定文件并重新安装。还要给出--optimize-autoloader (-o) 参数,如http://getcomposer.org/doc/03-cli.md#install中所述

    2. 您在配置中激活了 apc 缓存,但没有在 /web 目录中的启动文件(通常为 app.php)中正确实现它。在这种情况下,请查看新下载的启用 APC 的文件,或https://github.com/dbu/symfony-project/blob/master/web/app.php。已注释的部分应取消注释。

    【讨论】:

    • 第 2 点是否也会影响app_dev.php?如果不是,则不适用于该问题。无论如何,谢谢 - 你让我发现了一些东西:)
    【解决方案3】:

    有一个类似的问题,它从缺少 Request 类开始,但并没有就此结束。结果是我的 FTP 客户端(FileZilla 和 WinSCP)在传输远程服务器时遇到了问题,报告成功但导致 0 字节文件(在 Windows 7 上)。

    尝试了一些有关传输设置的方法,但没有成功。 WinSCP 至少会报告断开连接,然后由于远程计算机上的文件锁定而导致传输失败。这导致项目中充斥着 0byte 文件和自动加载器故障。

    切换到另一个 FTP 客户端 (CoffeeCup FreeFTP) 并且传输正常,目前不确定其他客户端为什么会出现此问题,不幸的是托管支持也无法解释。

    【讨论】:

    • 很高兴知道,但我认为情况并非如此,因为我使用了 Cygwin/rsync。还是谢谢
    【解决方案4】:

    转到:

     vendor/symfony/symfony/src/symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php
    

    然后改变

    protected $started = false;
    

    protected $started = TRUE;
    

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 2017-07-06
      • 2015-12-16
      • 2020-01-29
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      相关资源
      最近更新 更多