【问题标题】:Class not found error only on production server仅在生产服务器上找不到类错误
【发布时间】:2012-09-19 23:34:32
【问题描述】:

我正在使用 Silex 开展一个项目。在一个特定的文件中,我添加了一个use 语句让自动加载器包含一个特定的php 文件。稍后在文件中,我使用该类。开发服务器上一切正常,但是当我进入生产环境时,我收到了Fatal error: Class not found 消息。编辑:两台服务器现在都使用 PHP 5.4.4。

是否有任何类型的安装特定问题可能导致此问题?我可以确认 composer 生成的两个命名空间自动加载文件是相同的。

为了完整起见,这里是包含语句:

use Instaphp;

这里是后面代码中类的使用:

$app['instaphp'] = $app->share(function() use ($app) {
            if($app['tagframe.instagram_token'] === null) {
                return Instaphp\Instaphp::Instance();
            } else {
                return Instaphp\Instaphp::Instance($app['tagframe.instagram_token']);
            }
        });

        $app['instaphp.config'] = $app->share(function() use ($app) {
            return Instaphp\Config::Instance();
        });

这是确切的错误:

Fatal error: Class 'Instaphp\Config' not found in /var/www/silexsandbox/src/TagFrame/Silex/TagFrameServiceProvider.php on line 89

更新:我应该补充一点,在我正在处理的相当大的代码库中,我在其他任何地方都没有遇到过这样的错误,所以我知道这并不像所有命名空间都不起作用那么简单。

【问题讨论】:

  • 可能听起来微不足道,但您确定您已在生产服务器上安装了供应商(或在最新更改后更新)?
  • 你在运行 PHP-FPM 吗?也许启用了 APC?您可以尝试重新加载 FPM 工作人员吗?

标签: php namespaces silex


【解决方案1】:

感谢 cmets。我确实确保我使用 Composer 进行了更新,以便转储自动加载器。

问题(我在几个小时的摆弄后发现)是我使用的第三方库(Instaphp)的目录结构是小写的。这并没有给我的 Mac 带来问题,但生产服务器正在运行 Ubuntu,我想它使用了区分大小写的文件处理实用程序,而 Mac 没有。

在这件事上花了一个晚上,我完全自责!

【讨论】:

  • 但是多亏了这个答案,我花了 5 分钟才解决它,那个晚上是值得的 ^^
【解决方案2】:

默认情况下,Mac 使用日志式不区分大小写的文件系统。 Linux,取决于你的风格,主要是区分大小写的。这肯定会导致您在上面描述的行为。

我建议您在 Mac 上创建第二个分区并将其格式化为 Journaled Case-Sensitive 以使其更接近您的生产环境。

【讨论】:

  • 您确实可以在 osx 上以区分大小写模式格式化另一个分区,但似乎不建议您的 os 分区使用它,因为某些应用程序将无法运行。例如:Photoshop helpx.adobe.com/creative-suite/kb/… 有这样一个想法的其他分区可能没问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2013-07-29
  • 2020-03-28
  • 2019-04-27
  • 1970-01-01
  • 2018-07-30
  • 2021-11-16
相关资源
最近更新 更多