2015-09-22 3 views
4

Я получаю сообщение об ошибке в моем Laravel 5 приложения:Laravel 5,1: Невозможно переопределить класс Осветить \ Договоров \ Поддержка \ Arrayable

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

Эта ошибка происходит только на моей промежуточной среды, а не на мой местный веб-сайт. Я бы хотел опубликовать больше информации, но у меня ее нет. Потому что я не знаю, где эта ошибка вызвана.

Если я удалю файл (cache/compiled.php), все работает нормально. Но после каждого развертывания возникает одна и та же ошибка. На моем локальном хосте все работает отлично.

Мой вопрос: кто-нибудь знает, где искать, потому что я вне идей.

+0

Возможный дубликат [PHP Неустранимая ошибка: не удается переопределить класс] (http://stackoverflow.com/questions/708140/php-fatal-error-cannot-redeclare-class) – netaholic

+0

Нет, уже видел это. Благодарю. – markioooo

+0

У меня вдруг такая же проблема. – Propaganistas

ответ

4

Попробуйте этот путь.
Сначала удалите файл кэша/compiled.php
затем запустить эту команду

php artisan clear-compiled 
+0

Удаление файла cache/compiled.php (и выполнение с явным скомпилированным и php-мастерингом php-artisan: clear) будет временно исправлять это до тех пор, пока я не перераспределяю мой проект (используя Capistrano). Я использую ту же настройку для других проектов, и у меня нет проблем. – markioooo

+0

Вышеприведенное решение не работает в случаях, когда проблема зависимости возникает во время обычной загрузки приложения, потому что сам мастер не запускается. В этом случае единственным решением является вручную удалить bootstrap/cache/compiled.php. – JamesG

-1

Проблема с ремесленной optimize команды. Если вы удалите файл compiled.php, а затем не запустите optimize, он должен работать.

+0

Но 'оптимизация' * предполагается * работать. Просто сказать, что не использовать, это не правильный ответ. –

0

Я испытал то же самое, но в итоге нашел решение.

У меня есть свои helpers.php файлы в laravel. Так же, как и рамки, я добавил их как автозагрузки в свой composer.json. Пара этих функций - это макросы для Collection (\Illuminate\Support\Collection::macro(...)).

Когда файл helpers.php загружен автоматически, определение этих макросов вызывает автозагрузку Illuminate\Support\Collection. Это, в свою очередь, использует Illuminate\Contracts\Support\Arrayable. Итак, в основном все они уже загружены к моменту их определения в cache/compiled.php. Boom.

Краткая история: для меня исправить было просто включить включение скомпилированного файла и автозагрузчика.

самозагрузки/autoload.php:

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

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

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

Это не может быть жизнеспособным решением добавить код включать в скомпилированный файл запускается сразу и относится к вспомогательным функциям, но я думаю, что шансы на что происходит должен быть довольно минимальным.

1

У меня была такая же проблема, и нашел следующую статью, которая была очень полезна:

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

Единственное решение, которое работал для меня было вручную удалить bootstrap/cache/compiled.php. Переключение порядка, в котором вызываются автозагрузчики в bootstrap/autoload.php, не работает для меня, потому что у меня была та же проблема, наоборот. У меня был класс в compiled.php, который вызывал что-то от autoload.php до автозагрузки до autoload.php.

В моем случае, я использую сочетание PSR4 и ручных сопоставлений классов в моем файле composer.json. Я уверен, что это часть проблемы.(Не судите меня: это приложение было запущено в Laravel 3, поэтому требуется добавить пространство имен по всей базе кода :-).

Одна из причин, почему все может работать по-разному в разных средах, потому что команда artisan optimize будет генерировать только файл bootstrap/cache/compiled.php, если вы предоставите возможность --force или если режим отладки является не включены. Поэтому вполне вероятно, что вы не получаете этот файл в разработке, потому что отладка включена, но : получение этого файла в стадии постановки и/или производства, потому что отладка не включена.

В конце концов, вот что я приземлился на качестве решения для развертывания производства:

  1. artisan config:cache
  2. artisan optimize
  3. rm bootstrap/cache/compiled
  4. Update символическая, чтобы указать на новую версию.

Таким образом, вы все равно получаете bootstrap/cache/services.json, что полезно, тогда как artisan clear-compiled удаляет этот файл. Кроме того, будет очень короткий период времени, когда будет существовать bootstrap/cache/compiled.php, поэтому важно запустить эти команды до, вы обновляете символическую ссылку, чтобы указать ваш веб-сервер в новой версии.

Стоит также не отметить, что compiled.php файл, который создается artisan optimize в Laravel 5.1 больше не генерируется в Laravel 5.4, поскольку, как Тейлор заявил, PHP 7 является гораздо более производительным и поэтому польза от комплектации все заявки классы в один файл, который предназначен для сохранения на дисках ввода/вывода, теперь игнорируется. Тейлор рекомендует включить и правильно настроить ваш OPcache - вы получите гораздо больше преимуществ от этого.

Смежные вопросы