Я хочу запустить свое приложение на локальном хосте с php artisan serve, но получаю эту ошибку unserialize(): Error at offset 0 of 40 bytes, где моя проблема?
Как я могу объяснить свою проблему? Я просто получаю эту ошибку на всей странице приложения @Stony
попробуйте php artisan serve -vvv. Если вы увидите более подробный вывод вашей ошибки, вы, вероятно, сможете найти причину.
@Tschitsch Я тестирую, но получаю только эту ошибку
Тогда вам, вероятно, следует углубиться в некоторые продвинутые методы отладки для php, иначе вам действительно сложно помочь, извините. Попробуйте ввести собственный error_handler, чтобы сначала получить подробный вывод. Я предполагаю, что ваше приложение полагается на некоторое сериализованное представление чего-либо, но мы не можем этого знать.
Какую версию Laravel вы используете? После версии 5.6.30 есть некоторые изменения, которые могут вызвать это. Обратитесь к руководству по обновлению для получения дополнительной информации laravel.com/docs/5.6/upgrade#upgrade-5.6.30
@ AdrianHernandez-Lopez версия моего laravel - 5.6, эта работа раньше, но теперь я получаю эту ошибку
@ AdrianHernandez-Lopez, ваш ответ поможет мне Я создал новый laravel и скопировал этот файл .env в этот проект, я удаляю файл .env и использую файл старой версии






У меня такая же ошибка, когда я обновляю приложение Laravel 5.5 до 5.6. Ошибка возникает из-за EncryptCookies-Middleware.
Удалите файлы cookie в своем браузере и / или очистите файлы сеанса в приложении Laravel.
Вы должны установить генерацию ключа новостей, потому что
php artisan key:generate
После этого теста снова запустить приложение Laravel.
php artisan serve
Зачем это нужно?
поскольку файлы cookie связаны с ключом приложений, если вы измените ключ, это будет похоже на то, что в вашем приложении снова нет файлов cookie
Будет ли он аннулировать сеанс всех пользователей, сеанс которых хранится в базе данных?
В App \ Exceptions \ Handler под функцией рендеринга используйте этот фрагмент, он сбросит cookie браузера.
if (str_contains($exception->getMessage(), 'unserialize')) {
$cookie1 = \Cookie::forget('laravel_session');
$cookie2 = \Cookie::forget('XSRF-TOKEN');
return redirect()->to('/')
->withCookie($cookie1)
->withCookie($cookie2);
}
да, для localhost вы можете просто удалить файлы cookie, но для производства поместите это в свой обработчик ошибок, чтобы пользователи не видели возгласов:
if (strpos($exception->getMessage(), 'unserialize(): Error at offset 0 of 40 bytes') === 0) {
unset($_COOKIE['laravel_session']);
unset($_COOKIE['XSRF-TOKEN']);
setcookie('laravel_session', null, -1, '/');
setcookie('XSRF-TOKEN', null, -1, '/');
abort(200, '', ['Location' => route('frontend.home')]);
}
PS. протестирован на laravel 5.6.
Я получил ту же ошибку пару дней назад, когда отправил производственное обновление в свой проект Laravel из Посланник.
Немедленное исправление: Я попытался откатиться к предыдущей фиксации, но проблема не исчезла, что означает, что проблема возникла на стороне клиента, вероятно, файлы cookie. Я попытался удалить файлы cookie, и проблема исчезла.
Позже я потратил много времени на поиски этой проблемы, но ничего не нашел, пока снова не столкнулся с этой проблемой сегодня с другим развертыванием, и я нашел эту статью об обновлении Новости Laravel об исправлении безопасности5.6.30. Мне удалось определить, что эта проблема возникает, если я пытаюсь развернуть предыдущую (<5.6.30) версию laravel v5.6.26 для проекта, который уже использовал> v5.6.30, и файлы cookie уже были созданы (не serliazed), которые когда <5.6.30 версия фреймворка пытается удалить результаты из-за ошибки, потому что они не реализованы должным образом.
Configuring Cookie Serialization Since this vulnerability is not able to be exploited without access to your application's encryption key, we have chosen to provide a way to re-enable encrypted cookie serialization while you make your application compatible with these changes. To enable / disable cookie serialization, you may change the static serialize property of the App\Http\Middleware\EncryptCookies middleware:
Я смог навсегда исправить эту проблему, очистив кеш композитора, заставив его загружать последнюю версию фреймворка вместо того, чтобы возвращаться к кешу.
Надеюсь это поможет.
Лучшие,
composer dump-autoload?
В моем случае я удалил свой composer.lock и сделал composer install и вуаля ...
$ cd project_root
$ rm composer.lock
$ composer install
Работай для меня в Laravel 5.5
Никогда не рекомендуется просто удалять composer.lock. Это может сработать, когда вы работаете с приложением hello world на рабочем столе, но не с рабочим приложением. Подробнее см. Здесь: stackoverflow.com/a/49593368/766570
Я делаю это все время. Если вы правильно закрепили версии в composer.json, это вообще не должно быть проблемой. по крайней мере, из моего опыта.
Обычно в composer.json вы указываете не точные версии зависимостей, а минимальную версию и выше. Без composer.lock при запуске composer install будет установлена последняя стабильная версия конкретной зависимости, которая может больше не работать с вашим приложением.
Я знаю и согласен. И обычно я не буду входить в продакшн, удалять composer.lock или какой-либо другой файл и устанавливать композитор.
вы просто запустите терминал
composer global update
Я столкнулся с той же проблемой. Я часто сталкивался с этой проблемой в бродячей среде Homestead. Чтобы решить эту проблему в Laravel 5.4,5.5,5.6 или более -
Конфигурация php artisan: очистить
php artisan view: ясно
php artisan key: сгенерировать
php artisan config: clear может понадобиться, а может и не понадобиться, в зависимости от ваших настроек. Этот мне не нужен, но мне нужны следующие 2.
Я также столкнулся с этой проблемой, когда мне довелось обновить свой композитор. Если вы положите
protected static $serialize = true;
внутри App \ Http \ Middleware \ EncryptCookies старый файл cookie сломает вашу систему. Поэтому, чтобы предотвратить это, вы должны либо очистить файл cookie, либо просто не выполнять десериализацию дешифрованного файла cookie.
Я сделал обходной путь для этого: Внутренний поставщик / laravel / framework / src / Illuminate / Encryption / Encrypter.php Над этой строкой функции decrypt ():
return $unserialize ? unserialize($decrypted) : $decrypted;
добавлять:
try {
return $unserialize ? unserialize($decrypted) : $decrypted;
} catch (\Exception $e){
return $decrypted;
}
Это может быть некрасиво, но вы можете временно поместить его туда, пока не решите, что старые файлы cookie исчезли.
Интересный. Но почему бы просто не удалить старый файл cookie в браузере?
@molerat уверен, что вы можете просто очистить свои файлы cookie, но если ваш сайт был общедоступным для многих пользователей, то, вероятно, вы не хотите прерывать их работу.
Хорошая точка зрения. Я не думал об этом, потому что мое окружение на данный момент все еще является локальным и частным.
ваше исправление не будет работать, когда вы обновите свой laravel, так как обновление сотрет ваши изменения (внутри каталога vendor). Этот ответ работает для приложений localhost hello world, но для производственных приложений
@abbood да, поэтому я сказал, что это временное исправление, пока старые файлы cookie от ваших пользователей не исчезнут. Или вы можете переопределить этот метод, чтобы сделать это постоянным исправлением.
В моем случае я пытался расшифровать хеш с неправильной функцией.
Я создавал шифрование с помощью encryptString ()
$hash = Crypt::encryptString('secret');
но я пытался расшифровать с помощью decrypt ()
$value = Crypt::decrypt($hash);
правильный путь
$value = Crypt::decryptString($hash);
Поэтому, когда вы шифруете с помощью Crypt::encrypt(), вы должны расшифровать его с помощью Crypt::decrypt(), а для Crypt::encryptString() используйте Crypt::decryptString().
В моем случае произошло во время локальной разработки. Шаги, которые вызвали проблему:
Я также был авторизован в своем приложении, и, следовательно, также был файл cookie сеанса. В этом случае я просто очистил файлы cookie браузера и получил новые.
В firefox это можно сделать, зайдя, затем выберите about:preferences#privacy и выберите соответствующий вариант. как показано на следующих изображениях (на греческом языке)
Настройка конфиденциальности и указание, где пользователь нажимает
Другой подход для диагностики проблемы - открыть частный браузер Firefox или использовать режим chromesognito.
Вы им пользуетесь из коробки? Или в какой части кода появляется ошибка? Немного сложно помочь вам без кода или дополнительной информации.