Я немного борюсь с этим и не могу понять, может быть, у кого-то есть или, может быть, здесь есть более глубокая проблема с Slim, PHP, Apache и т. Д. После работы всего несколько часов, моя установка Slim начнет давать это на всех маршрутах:
Неустранимая ошибка: Class Slim \ Collection содержит 1 абстрактный метод и поэтому должен быть объявлен абстрактным или реализовать оставшиеся методы (IteratorAggregate :: getIterator) в F: \ Projects \ example \ server \ vendor \ slim \ slim \ Slim \ Collection.php on строка 21
Как ни странно, этот вопрос уходит, если я перезапущу Apache. (В течение нескольких часов).
Я нашел это, когда у кого-то была аналогичная проблема два года назад, и тот, кто помогал им, без помощи вообще: https://community.apachefriends.org/viewtopic.php?p=250966&sid=96ef58aaeb7fe142a7dcdfd506a8683f
Я пробовал сделать чистую очистку и установить каталог моего поставщика. Это не исправляет. Я могу ясно видеть, что getIterator
реализован как ожидалось в файле в сообщении об ошибке.
PHP версии 7.0.12, Windows 7, x86 PHP Build
Это произошло снова через несколько часов с другим, но похожим сообщением об ошибке:
Fatal error: Class Pimple \ Container содержит 1 абстрактный метод и поэтому должен быть объявлен абстрактным или реализовать оставшиеся методы (ArrayAccess :: sqlserver) в F: \ Projects \ example \ server \ vendor \ pimple \ pimple \ src \ Pimple \ Container. php в строке 34
Этот вопрос имеет схожую проблему и «решает» ее, перезагружая PHP, но это явно не является реальным решением, и у меня нет opcache: PHP 7, Symfony 3: Fatal error 1 abstract method и поэтому должен быть объявлен аннотация или реализовать оставшиеся методы
Какие-нибудь догадки? Помните: это сообщение в файлах, которые я не писал, и уходит на перезапуск Apache. Есть ли какое-то кэширование с PHP 7, которое может вызвать это?
Редактировать 3/10/17:
Да, я открыл билет с Slim. Я также видел это в не-тонком файле (Pimple), поэтому я не думаю, что это тонкая проблема. https://github.com/slimphp/Slim/issues/2160
Как я уже сказал, мой опкаш отключен. Я подтвердил, что это верно как в файле php.ini, так и в phpinfo ().
Я думаю, вы столкнулись с этой ошибкой opcache . Это не совсем то же самое, но, вероятно, связано.
После вызова функции opcache_reset () мы сталкиваемся с некоторыми странными ошибками. Это происходит случайным образом на серверах (10 из 400 серверов)
Некоторые буквы заменены другими, класс, кажется, уже объявлен .. и т. Д.
Пример ошибок, вызванных после opcache_reset ():
- PHP Неустранимая ошибка: класс XXX содержит 1 абстрактный метод и поэтому должен быть объявлен абстрактным или реализовать оставшиеся методы (YYY :: funczzz) в /dir/dir/x.php в строке 20
Билет закрыт, потому что разработчикам не хватает информации для его воспроизведения. Если вы можете придумать самый маленький воспроизводимый случай, я рекомендую сообщить об этом . Создайте очень маленькое Slim-приложение, а затем используйте JMeter или другой инструмент, чтобы сделать много запросов. Опубликуйте свои выводы.
Между тем единственным обходным решением может быть отключить opcache в php.ini:
opcache.enable=0
Конечно, это резко повредит работе. Пока он не будет исправлен, вам придется выбирать между производительностью или периодическим перезапуском Apache.
Если отключение кеша не работает, единственной причиной, о которой я мог думать, является проблема с прерывистым компилятором. Кэшированная или не скомпилированная версия должна иметь ошибку. Открытие воспроизводимого билета с помощью PHP-разработчиков или отладка исходного кода PHP будет единственным способом продвижения, если это является причиной.
Если вы разрабатываете Windows, я бы рекомендовал вам НЕ использовать XAMPP или WAMPP и попробовать настоящий сервер разработки с использованием Linux на виртуальной машине.
Попробуйте установить Vagrant и Virtualbox, а затем перейдите на сайт puphpet.com, который может создать вам конфигурацию виртуальной машины. Разархивируйте загрузку, cd в папку, введите vagrant вверх. Затем просто укажите свой хост на виртуальной машине. Ставлю, если у вас есть реальная среда разработки, эта ошибка исчезнет. Другой вариант – Docker, но у него немного кривая обучения.
Проблема заключается не в вашем коде (или вашем коде поставщика), а в вашей платформе.
У меня была такая же проблема с использованием CodeIgniter и PHP 7.1.x.
Я обновился до PHP 7.2, и проблема больше не возникала.