Проверить, если PHP сессия уже началась
у меня есть PHP-файл, который иногда вызывается со страницы, которая начала сеанс, а иногда со страницы, которая не начала сеанс. Поэтому когда у меня session_start()
на этом скрипте я иногда получаю сообщение об ошибке для "сеанс уже запущен". Для этого я поставил следующие строки:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
но на этот раз я получил это предупреждение:
обратите внимание: неопределенная переменная: _SESSION
есть ли лучший способ проверить, если сессия уже началась?
Если я использую @session_start
это заставит все работать правильно и просто заткнуть предупреждения?
25 ответов:
рекомендуемый способ для версий PHP > = 5.4.0
if (session_status() == PHP_SESSION_NONE) { session_start(); }
Источник:http://www.php.net/manual/en/function.session-status.php
для версии PHP
if(session_id() == '') { session_start(); }
для версий PHP до PHP 5.4.0:
if(session_id() == '') { // session isn't started }
хотя, IMHO, вы действительно должны подумать о рефакторинге кода управления сеансами, если вы не знаете, запущен ли сеанс...
в PHP 5.4 введен session_status (), что более надежно, чем полагаться на
session_id()
.рассмотрим следующий фрагмент:
session_id('test'); var_export(session_id() != ''); // true, but session is still not started! var_export(session_status() == PHP_SESSION_ACTIVE); // false
Итак, чтобы проверить, запущен ли сеанс, рекомендуемый способ в PHP 5.4 теперь:
session_status() == PHP_SESSION_ACTIVE
вы можете сделать это, и это действительно легко.
if (!isset($_SESSION)) session_start();
надеюсь, что это помогает :)
if (version_compare(phpversion(), '5.4.0', '<')) { if(session_id() == '') { session_start(); } } else { if (session_status() == PHP_SESSION_NONE) { session_start(); } }
до PHP 5.4 нет надежного способа узнать, кроме установки глобального флага.
считаем:
var_dump($_SESSION); // null session_start(); var_dump($_SESSION); // array session_destroy(); var_dump($_SESSION); // array, but session isn't active.
или:
session_id(); // returns empty string session_start(); session_id(); // returns session hash session_destroy(); session_id(); // returns empty string, ok, but then session_id('foo'); // tell php the session id to use session_id(); // returns 'foo', but no session is active.
Итак, до PHP 5.4 вы должны установить глобальное логическое значение.
для всех версий php
if ((function_exists('session_status') && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) { session_start(); }
проверить это :
<?php /** * @return bool */ function is_session_started() { if ( php_sapi_name() !== 'cli' ) { if ( version_compare(phpversion(), '5.4.0', '>=') ) { return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE; } else { return session_id() === '' ? FALSE : TRUE; } } return FALSE; } // Example if ( is_session_started() === FALSE ) session_start(); ?>
Источник http://php.net
использовать идентификатора session_id(), он возвращает пустую строку, если оно не задано. Это более надежно, чем проверка
$_COOKIE
.if (strlen(session_id()) < 1) { session_start(); }
Это должно работать для всех версий PHP. Он определяет версию PHP, а затем проверяет, запускается ли сеанс на основе версии PHP. Затем, если сеанс не запущен, он запускает его.
function start_session() { if(version_compare(phpversion(), "5.4.0") != -1){ if (session_status() == PHP_SESSION_NONE) { session_start(); } } else { if(session_id() == '') { session_start(); } } }
Не уверен в эффективности такого решения, но это из рабочего проекта Это также используется, если вам нужно определить язык по умолчанию
/** * Start session * Fall back to ukrainian language */ function valid_session() { if(session_id()=='') { session_start(); $_SESSION['lang']='uk'; $_SESSION['lang_id']=3; } return true; }
вы должны реорганизовать свой код так, чтобы вызвать
session_start()
ровно один раз за оформление страницы.
на PHP 5.3 это работает для меня:
у вас есть. Если вы не ставите оператор not at if, начинающий сеанс начнется каким-либо образом, я не знаю, почему.if(!strlen(session_id())){ session_name('someSpecialName'); session_start(); }
ответ на основе ответа @Meliza Ramos (см. Первый ответ) и http://php.net/manual/en/function.phpversion.php,
действия:
- определить PHP_VERSION_ID если не существует
- определить функцию для проверки версии на основе PHP_VERSION_ID
- определить функцию для openSession () secure
использовать только openSession()
// PHP_VERSION_ID is available as of PHP 5.2.7, if our // version is lower than that, then emulate it if (!defined('PHP_VERSION_ID')) { $version = explode('.', PHP_VERSION); define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); // PHP_VERSION_ID is defined as a number, where the higher the number // is, the newer a PHP version is used. It's defined as used in the above // expression: // // $version_id = $major_version * 10000 + $minor_version * 100 + $release_version; // // Now with PHP_VERSION_ID we can check for features this PHP version // may have, this doesn't require to use version_compare() everytime // you check if the current PHP version may not support a feature. // // For example, we may here define the PHP_VERSION_* constants thats // not available in versions prior to 5.2.7 if (PHP_VERSION_ID < 50207) { define('PHP_MAJOR_VERSION', $version[0]); define('PHP_MINOR_VERSION', $version[1]); define('PHP_RELEASE_VERSION', $version[2]); // and so on, ... } } function phpVersionAtLeast($strVersion = '0.0.0') { $version = explode('.', $strVersion); $questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2]; if(PHP_VERSION_ID >= $questionVer) return true; else return false; } function openSession() { if(phpVersionAtLeast('5.4.0')) { if(session_status()==PHP_SESSION_NONE) session_start(); } else // under 5.4.0 { if(session_id() == '') session_start(); } }
if (version_compare(PHP_VERSION, "5.4.0") >= 0) { $sess = session_status(); if ($sess == PHP_SESSION_NONE) { session_start(); } } else { if (!$_SESSION) { session_start(); } }
на самом деле, теперь уже слишком поздно объяснять это здесь, так как это было решено. Это был .inc файл одного из моих проектов, где вы настраиваете меню для ресторана, выбрав блюдо и удалить/добавить или изменить заказ. Сервер, на котором я работал, не имел фактической версии, поэтому я сделал его более гибким. Это до авторов хотят использовать и попробовать его.
PHP_VERSION_ID доступно с PHP 5.2.7, поэтому сначала проверьте это и , если необходимо, создайте его.
session_status
доступен с PHP 5.4, поэтому мы должны проверить это тоже:if (!defined('PHP_VERSION_ID')) { $version = explode('.', PHP_VERSION); define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); }else{ $version = PHP_VERSION_ID; } if($version < 50400){ if(session_id() == '') { session_start(); } }else{ if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } }
на основе моей практики, прежде чем получить доступ к
$_SESSION[]
нужно позвонитьsession_start
каждый раз использовать скрипт. См. ссылку ниже для руководства.http://php.net/manual/en/function.session-start.php
для меня по крайней мере
session_start
сбивает с толку имя. Аsession_load
может быть более ясным.
Я закончил с двойной проверкой статуса. php 5.4+
if(session_status() !== PHP_SESSION_ACTIVE){session_start();}; if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
вы можете использовать следующее решение, чтобы проверить, если сеанс PHP уже начался:
if(session_id()== '') { echo"Session isn't Start"; } else { echo"Session Started"; }