Laravel 5.1:无法重新声明类Illuminate \\ Contracts \\ Support \\ Arrayable

时间:2015-09-22 10:00:27

标签: php laravel

我在Laravel 5应用程序中收到错误消息:

PHP Fatal error:  Cannot redeclare class Illuminate\\Contracts\\Support\\Arrayable in /var/www/.../bootstrap/cache/compiled.php on line 156

此错误仅发生在我的暂存环境中,而不是我的本地网站上。我想发布更多信息,但我没有。因为我不知道这个错误在哪里造成的。

如果删除文件(cache / compiled.php),一切似乎都能正常工作。但每次部署后都会发生同样的错误。在我的本地主机上一切正常。

我的问题:有没有人知道在哪里看,因为我没有想法。

4 个答案:

答案 0 :(得分:4)

试试这种方式。
首先删除cache / compiled.php文件
然后运行此命令

php artisan clear-compiled

答案 1 :(得分:1)

我遇到了同样的问题并找到了以下文章,这非常有帮助:

https://sentinelstand.com/article/laravel-5-optimization-commands

唯一适合我的解决方案是手动删除bootstrap/cache/compiled.php。切换bootstrap/autoload.php中调用自动加载器的顺序对我来说不起作用,因为我反过来也有同样的问题,即。我在compiled.php中有一个课程导致autoload.phpautoload.php运行之前自动加载。

就我而言,我在composer.json文件中使用了PSR4和手动类映射的组合。我确定这是问题的一部分。 (不要判断我:这个应用程序是从Laravel 3开始的,因此需要花时间在整个代码库中添加命名空间: - )。

在不同环境中事物可能有不同作用的一个原因是,如果您提供artisan optimize选项或调试模式为bootstrap/cache/compiled.php命令将仅生成--force文件没有启用。所以很可能你没有开发这个文件,因为启用了调试,但 将此文件放在暂存和/或生产中,因为调试启用。

归根结底,这是我作为生产部署解决方案所取得的成果:

  1. artisan config:cache
  2. artisan optimize
  3. rm bootstrap/cache/compiled
  4. 更新符号链接以指向新版本。
  5. 这样您仍然可以获得bootstrap/cache/services.json,这很有用,而artisan clear-compiled会删除该文件。此外,bootstrap/cache/compiled.php将存在非常短暂的时间段,这就是为什么在更新符号链接之前运行这些命令以将Web服务器指向新的版本

    值得注意的是,Laravel 5.1中的compiled.php创建的artisan optimize文件不再在Laravel 5.4中生成,因为正如Taylor所说,PHP 7的性能要高得多,所以将所有应用程序类捆绑到一个文件中的好处现在可以忽略不计,这个文件是为了节省磁盘I / O. Taylor建议启用并正确配置您的OPcache - 您将从中获得更多的性能优势。

答案 2 :(得分:0)

我经历过同样的事情,但最终找到了解决方案。

我在laravel中拥有自己的helpers.php个文件。就像框架一样,我在composer.json中将它们添加为自动加载。其中一些函数是Collection\Illuminate\Support\Collection::macro(...))的宏。

helpers.php文件被自动加载时,这些宏的定义会导致Illuminate\Support\Collection的自动加载。这反过来使用Illuminate\Contracts\Support\Arrayable。 因此,基本上所有这些都已在cache/compiled.php中再次定义时加载。的动臂

长话短说:对我而言,解决方法只是切换编译文件和自动加载器的包含。

<强>自举/ autoload.php

$compiledPath = __DIR__.'/cache/compiled.php';

if (file_exists($compiledPath)) {
   require $compiledPath;
}

require __DIR__.'/../vendor/autoload.php';

这可能不是一个可行的解决方案,在编译后的文件中添加包含代码会立即运行并引用辅助函数,但我认为发生这种情况的可能性非常小。

答案 3 :(得分:-1)

问题在于工匠optimize命令。如果删除compiled.php文件,然后不运行optimize,它应该可以工作。