2015-05-09 7 views
0

я работал в проекте с использованием Laravel 4.2 и вдруг случайно затемненными произошел, и когда я снова oppened моего проекта, я столкнулся с этой ошибкой:Как исправить десериализируются (ошибки)

unserialize(): Error at offset 0 of 319 bytes

Это происходит в любой странице проекта. Как я могу это исправить?

enter image description here

+0

Часто случается, что вы сериализовали массив, начинающийся с 0-го индекса. Попробуйте манипулировать этим индексом массива, к которому вы собираетесь несериализовать и получить эту ошибку. чтобы этот индекс массива начинался с 1, а затем сериализовал его и несериализовал и проверял. –

+0

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

ответ

0

Попробуйте понять, что это неправильно

try { 
    unserialize($data); 
} catch ($e) { 
    error_log($data . PHP_EOL . print_r($e, true); 
} 
0

Иногда, кодирование символ может испортить ваши сериализованные объекты/переменные.

Попробуйте использовать base64, чтобы быть безопасным во всех случаях: Encode:

$var = "somestuff"; 
$ouput = serialize(base64encode($var)); 

Decode:

$var = base64decode(unserialize($ouput);) 
0

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

Решения:

1- Не поощряйте производство. Вы должны удалить все файлы сеанса в приложении/хранилище/сеансе.

Сессия Laravel для пользователя (или ПК) связана с Cookie на стороне клиента, а Laravel создаст файл сеанса для каждого из браузеров, который запрашивает информацию на вашем сервере. Вы не знаете, какой файл предназначен для каждого пользователя при просмотре файлов. Таким образом, удаление всех файлов сеанса приведет к уничтожению всех сеансов пользователей. Я нашел работу, которая автоматически удаляет один сеанс для одного пользователя (или браузера), и пользователь должен будет повторить попытку, и он будет работать.

2- Только если вы вынуждены справляться с срочностью производства. Это будет 4 строки кода в 2 файлах. В вашей картине, метод readFromHandler называется в классе Магазин в Осветите \ Session \ Store.php, добавить глобальную переменную, чтобы поймать SESSIONID (то есть реальное имя файла файла сеанса):

protected function readFromHandler() 
{ 
    $data = $this->handler->read($this->getId()); 

    $GLOBALS['sess_id'] = $this->getId(); 

    return $data ? unserialize($data) : array(); 
} 

И есть файл, который обрабатывает все ошибки в Laravel, прежде чем даже получить App готово: \ Illuminate \ Exception Handler.php. Изменить метод handleEror к этому:

public function handleError($level, $message, $file = '', $line = 0, $context = array()) 
{ 
    //Ensure the error is about unserialize() and is coming from Store.php 
    if(strpos ($message, 'unserialize(): Error at offset') !== false && 
     strpos ($file, 'Store.php') !== false) 
     unlink('../app/storage/sessions/'.$GLOBALS['sess_id']); 

    if (error_reporting() & $level) 
    { 
     throw new ErrorException($message, 0, $level, $file, $line); 
    } 
} 

Я знаю, что вы не должны изменять Laravel Core, но я надеюсь, что это поможет вам и другим людям, чтобы понять его и придумать лучше и 100% приемлемого решения.

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