我在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),一切似乎都能正常工作。但每次部署后都会发生同样的错误。在我的本地主机上一切正常。
我的问题:有没有人知道在哪里看,因为我没有想法。
答案 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.php
在autoload.php
运行之前自动加载。
就我而言,我在composer.json
文件中使用了PSR4和手动类映射的组合。我确定这是问题的一部分。 (不要判断我:这个应用程序是从Laravel 3开始的,因此需要花时间在整个代码库中添加命名空间: - )。
在不同环境中事物可能有不同作用的一个原因是,如果您提供artisan optimize
选项或调试模式为,bootstrap/cache/compiled.php
命令将仅生成--force
文件没有启用。所以很可能你没有开发这个文件,因为启用了调试,但 将此文件放在暂存和/或生产中,因为调试不启用。
归根结底,这是我作为生产部署解决方案所取得的成果:
artisan config:cache
artisan optimize
rm bootstrap/cache/compiled
这样您仍然可以获得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
,它应该可以工作。