Я тоже сталкиваюсь с этим, и настройка в $_SESSION
не подходит для меня.Для PHP 5.3.8:
- Если с запросом был запущен какой-либо сеанс,
define('SID')
вернет FALSE
, а $_SESSION
не установлено. - Этоне зависит, был ли
session_id()
использован для установки идентификатора сеанса или нет. - После первого
session_start()
, SID
определено и $_SESSION
установлено в пустой массив. session_destroy()
сбрасывает session_id()
, тогда это пустая строка.SID
останется определенным (и будет установлено его предыдущее значение, которое может быть пустой строкой).$_SESSION
оставлено без изменений.Он будет сброшен / заполнен в следующий раз при вызове session_start
.
С этими состояниями, тем более что между ними можно вызвать session_id()
, чтобы установить идентификатор для next сеанс, невозможно безопасно определить состояние сеанса с помощью SID
, $_SESSION
и session_id()
.
«Попытка» с помощью session_start()
(например, с @
) может быть не очень полезной,так как это изменит статус сеанса и изменит содержимое $_SESSION
(и добавит заголовок set-cookie, если cookie не был частью запроса).В моем случае это не подходило.
Пока я выполнял тесты, я столкнулся с тем, что нельзя пытаться изменить настройку ini session.serialize_handler
, когда сеанс активен, даже когда выустановите его на то же значение.То же самое верно для session.use_trans_sid
Документов , что является более легким.Это привело меня к следующей функции:
/**
* @return bool
*/
function session_is_active()
{
$setting = 'session.use_trans_sid';
$current = ini_get($setting);
if (FALSE === $current)
{
throw new UnexpectedValueException(sprintf('Setting %s does not exists.', $setting));
}
$result = @ini_set($setting, $current);
return $result !== $current;
}
Насколько я вижу, ошибка проверяет только состояние активного сеанса (не отключено), поэтому это не должно возвращать ложное срабатывание, когда сеансы отключены.
Чтобы эта функция была совместима с PHP 5.2, требуется небольшая модификация:
/**
* @return bool
*/
function session_is_active()
{
$setting = 'session.use_trans_sid';
$current = ini_get($setting);
if (FALSE === $current)
{
throw new UnexpectedValueException(sprintf('Setting %s does not exists.', $setting));
}
$testate = "mix$current$current";
$old = @ini_set($setting, $testate);
$peek = @ini_set($setting, $current);
$result = $peek === $current || $peek === FALSE;
return $result;
}
Некоторые песочница .