Как определить факт "стартанутости" сессии ( isset ($_SESSION) не подходит )

Сергей123

Новичок
Как определить факт "стартанутости" сессии ( isset ($_SESSION) не подходит )

Вопрос: если бы я в какой-то строке PHP-кода, про которую известно только то, что она идёт до any output, хотел что-то записать в сессию, избежав notice'а про игнорирование повторного старта сессии, как я должен был бы проверить, стартанула уже сессия или нет?


Сначала ИМХО-резюме: мне кажется, что раз ввели notice об ignore'инге повторных session_start'ов, то должна быть PHP-функция, возвращающая логическое значение "стартанута"/"не стартанута", тем более что в сырцах этот флаг присутствует в явном виде.


isset ($_SESSION) не подходит, так как оно даёт TRUE при
вкл-м регистер глобалс и isset ($_REQUEST['_SESSION']) == TRUE.

'' != session_id() не подходит, так как session_write_close() его не сбрасывает плюс можно без всяких стартов сессии написать session_id('qwerty'); - и он уже не пустой, а сессии нет.

Определять наличие файла сессии тоже не то - это привязка к сессиям на файлах (т.е. не универсально) плюс в любом случае он создаётся при записи в сессию, а не при старте.


Если есть у кого мысли, кроме аля "нафиг страдать фигнёй", - милости прошу, а то пока я остановился на своём ИМХО-резюме (см. выше).
 

voland

Guest
session_start();
$_SESSION['on_off'] = 1;
-------------------

где-то в коде....
isset($_SESSION['on_off'])
Чисто дурацкий метод :)
 

Сергей123

Новичок
voland
при вкл-м регистер глобалс
проверка
isset ( $_SESSION['on_off'] )
сработает, если передать, например GETом, _SESSION['on_off']

-~{}~ 26.08.04 13:58:

Кроме того это накладывает определённые требования на окружение моей строчки (оно должно делать какие-то телодвижения), это не подходит.
 

Сергей123

Новичок
Макс
во первых, после session_write_close SID всё ещё defined,
во-вторых, - define('SID', 'qwerty'); работает тоже.
 

Фанат

oncle terrible
Команда форума
в-третьих, если есть кука, то дефайнед вернет труй.
в-четвертых, это задача из серии "напечатайте свой код". Требуется не обходной маневр, а ответ на вопрос.
 

Сергей123

Новичок
>> в-третьих, если есть кука, то дефайнед вернет труй
только, если стартанута сессия

Про "в-четвертых" не очень понял... Собственно, я согласен даже на обходной манёвр, но своими силами найти его не смог.
 

camka

не самка
а кинологическое изощрение не поможет?:

@session_start();
 

Кром

Новичок
>как я должен был бы проверить, стартанула уже сессия или нет?

[m]headers_sent[/m]
 

Фанат

oncle terrible
Команда форума
Бресь Сергей
Задавать вопросы на пхпклубе - тяжкая мука :)
Я бы на твоем месте спроси л бы, все же, где-нибудь поближе к зенду/пхпе.
 

tony2001

TeaM PHPClub
Бресь Сергей
начни с того, зачем это тебе.
судя по тому, что я о такой необходимости не слышал, ты хочешь что-то не то.
 

Фанат

oncle terrible
Команда форума
В общем, из описания задача вырисовывается, на мой вгляд, так:
Что-то вроде определения ,есть ли коннект к базе.
Т.е. некая либа в себе, которая должна быть полностью автономной и независимой от скрипта, в который ее встроили.
Есть сессия - юзает. Нету сессии - поднимает.
Я это так понимаю.
причем автономна до такой степени, что нельзя даже написать в начале скрипта unset($_SESSION);

Хотя... гоню. Какая автономность, если нужно контролировать отправку заголовков...

-~{}~ 27.08.04 00:37:

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

Другое дело - что с этим дисклеймером задача все больше и больше походит на высосанную из пальца.
 

tony2001

TeaM PHPClub
>Что-то вроде определения ,есть ли коннект к базе.
>Есть сессия - юзает. Нету сессии - поднимает.
ну это совсем разные вещи.
коннект к базе чуть сложней, чем вызов session_start().

в общем случае проще всего имхо проверить defined('SID') и ориентироваться на эту константу.

но все-таки хотелось бы услышать в чем необходимость такой проверки.
 

Макс

Старожил PHPClub
тут ИМХО не столько проверка старта сессии, сколько проверка, можно ли писать в сессию - запущена сессия и нет ли session_write_close(). Как раз именно со вторым проблема.
 

tony2001

TeaM PHPClub
насколько я вижу, это невозможно by design.
статус сессии после session_write_close меняется на php_session_none == статусу, если сессия не была запущена вообще.
кстати, это означает также и то, что после session_write_close() можно спокойно вызывать session_start() - ошибок не будет.
 

Макс

Старожил PHPClub
кстати, это означает также и то, что после session_write_close() можно спокойно вызывать session_start() - ошибок не будет.
ИМХО это как раз один из примеров, когда ПХП генерирует не нужные Нотайсы.. Если бы код
PHP:
 session_start();
session_start();
не генерировал нотайса для вторго старта, проблемы бы не было.
 

tony2001

TeaM PHPClub
Макс
если был session_write_close() - нотайса быть не должно.
в любом случае, есть @, если уж на сайте включены нотайсы.
вообще, конечно, такой уровень абстракции я не одобряю - раз уж модули ничего не знают друг о друге, то пускай хоть какой-то центральный модуль будет, который можно будет спросить об общем состоянии системы в данный момент.
 

neko

tеam neko
Автор оригинала: Фанат
В общем, из описания задача вырисовывается, на мой вгляд, так:
Что-то вроде определения ,есть ли коннект к базе.
Т.е. некая либа в себе, которая должна быть полностью автономной и независимой от скрипта, в который ее встроили.
Есть сессия - юзает. Нету сессии - поднимает.
что мешает в классе (или любой структуре) через который(ую) она работает хранить состояние?
не понимаю такой проблемы вообще

это куда проще и на порядки надежнее, чем полагаться на то, что от версии к версии эти редкоиспользуемые write_close итп будут работать одинакого
 

Сергей123

Новичок
[off]Прошу прощения за молчание - вчера пораньше уйти пришлось...[/off]

camka, написав "избежав notice'а", я имел ввиду не его подавление, а его отсутствие. Я думал о твоём варианте и, пока не найдено другого решения, я использую именно его, но без @ :)

Кром, если я правильно тебя понял, тогда то, что ты предложил - не нужно. Я в условии писал: "в какой-то строке PHP-кода, про которую известно только то, что она идёт до any output".

tony2001,
>> ты хочешь что-то не то
По большому счёту, - да. Повторный session_start при ini_set('display_errors', 0); - вроде бы ничего страшного. Только всё же "мне кажется, что раз ввели notice об ignore'инге повторных session_start'ов, то должна быть PHP-функция, возвращающая логическое значение "стартанута"/"не стартанута"". Ради "чистого кода", что ли...

Фанат,
>> некая либа в себе, которая должна быть полностью автономной
>> и независимой от скрипта, в который ее встроили
Ну да (точнее, максимально возможно автономной). По-моему, этого всегда надо добиваться.
>> Хотя... гоню. Какая автономность, если нужно контролировать отправку заголовков...
В описанном мною условии - не нужно (будем считать, что require_once скрипта я вписываю в месте, о ктором точно известно, что вывода не было ещё).
Кроме того, есть headers_sent. Хотя, вообще, не об этом сейчас...
>> с этим дисклеймером задача все больше и больше походит на высосанную из пальца
По большому счёту, - да. См. мой ответ tony2001 выше.

tony2001,
>> проще всего имхо проверить defined('SID')
А имхо - session_start без собаки, но это не "чистый код".
[off]Чую пошлют меня с этим термином... :)[/off]

Макс,
>> тут ИМХО не столько проверка старта сессии, сколько проверка,
>> можно ли писать в сессию - запущена сессия и нет ли session_write_close().
>> Как раз именно со вторым проблема.
Про session_write_close можно забыть. Она вообще всплыла только потому, что был вариант проверки пустоты session_id(). Но оказалось, что после session_write_close пустоты нет, а писать-то в сессию нельзя. Посему session_id не подошёл...
И ещё: в сырцах при session_write_close делается PS(session_status)=php_session_none; То есть сессия считается "не стартанутой", закрытой. Это я к тому, что, ПО-МОЕМУ, нет разделения на стартанутость и возможность писать.
>> ПХП генерирует не нужные Нотайсы
А имхо, - notice правилен, разработчик должен видеть этот факт и решать - хотел он дублирования или нет.

tony2001,
>> пускай хоть какой-то центральный модуль будет, который можно будет
>> спросить об общем состоянии системы в данный момент
Я собственно о том же... Не PHP ли является таким модулем? Почему бы не дать read-интерфейс к session_status?
 
Сверху