При использовании session_destroy () я получаю «Сбой объекта сеанса».
session_start(); if(isset($_SESSION['user_id'])){ $_SESSION=array(); if(isset($_COOKIE[session_name()])){ setcookie(session_name(),'',0,"/"); } session_destroy(); }
Что вызывает эту ошибку?
Ошибка:
Предупреждение: session_destroy (): Сбой объекта объекта
Это довольно тривиально, ни один сеанс не был запущен. Объект был запущен, поэтому вы не можете его уничтожить.
Оператор @
не всегда активен, например, с функциями отчетности об ошибках.
Редактировать:
1) Что вызывает эту ошибку?
Эта ошибка обычно возникает, когда PHP пытается удалить файл сеанса, но он не может его найти.
В вашем случае с session_destroy
есть только одно место в PHP, которое вызывает это. Вот когда session.save_handler
(см. Также session_set_save_handler
) возвращает FALSE
для действия destroy . Это может зависеть от типа используемого вами дескриптора сохранения, по умолчанию это файлы . С этим, когда параметр session.save_path
неверен (например, не доступный каталог), это приведет к такой ошибке.
2) Почему «@» не будет подавлять ошибку?
Это зависит от того, как создается вывод и от конфигурации PHP. @
не всегда работает. Например, обратные вызовы, зарегистрированные с помощью set_error_handler
будут получать эти сообщения.
В моем случае я пытался уничтожить сеанс до того, как был создан файл cookie. Другими словами, я сделал что-то вроде:
session_start(); ... session_destroy();
Таким образом, у сервера не было возможности «связаться» с браузером, прежде чем уничтожить сеанс. Простое решение, которое сработало для меня, было
session_start(); ... $_SESSION=array();
Если вы используете автозагрузчик, может не загрузиться класс, который сохраняется в сеансе.