Почему не удалось уничтожить объект объекта

При использовании 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(); 

Если вы используете автозагрузчик, может не загрузиться класс, который сохраняется в сеансе.