У моєму PHP-коді, якщо сеанс уже розпочався, і я намагаюся запустити новий, я отримую таке повідомлення:
Примітка: Сеанс уже розпочато - ігноруючи session_start ()
Як я можу цього уникнути?
У моєму PHP-коді, якщо сеанс уже розпочався, і я намагаюся запустити новий, я отримую таке повідомлення:
Примітка: Сеанс уже розпочато - ігноруючи session_start ()
Як я можу цього уникнути?
session_start()
в одне зі своїх включень, і require_once
це у кожному потрібному файлі.
Відповіді:
Спробуйте
<?php
if(!isset($_SESSION))
{
session_start();
}
?>
Якщо ви хочете новий, зробіть це, session_destroy()
перш ніж його запускати. Щоб перевірити, чи встановлено його перед початком, зателефонуйте session_status()
:
$status = session_status();
if($status == PHP_SESSION_NONE){
//There is no active session
session_start();
}else
if($status == PHP_SESSION_DISABLED){
//Sessions are not available
}else
if($status == PHP_SESSION_ACTIVE){
//Destroy current and start new one
session_destroy();
session_start();
}
Я хотів би уникнути перевірки глобального , $_SESSION
а не про я називаю session_status()
метод , так як PHP реалізована ця функція явно:
Виставити стан сесії за допомогою нової функції, session_status Це для (PHP> = 5.4.0)
Тільки якщо ви хочете знищити попередній сеанс:
<?php
if(!isset($_SESSION))
{
session_start();
}
else
{
session_destroy();
session_start();
}
?>
або ви можете використовувати
unset($_SESSION['variable_session _data'])
знищити певну змінну сеансу.
Так, ви можете визначити, чи вже запущений сеанс, перевіривши isset($_SESSION)
. Однак найкраща відповідь - просто не дзвонити session_start()
більше одного разу.
Його слід викликати дуже рано у вашому сценарії, можливо, навіть перший рядок, а потім не викликати знову.
Якщо у вас є більше, ніж в одному місці вашого коду, ви просите отримати цю помилку. Виріжте це так, щоб воно було лише в одному місці, і його можна викликати лише один раз.
Ви повинні вже викликати сеанс почати, можливо, вас знову викликають через включення?
if( ! $_SESSION)
{
session_start();
}
Notice: Undefined variable: _SESSION
. Використовуйте isset
замість цього.
Я зіткнувся з цією проблемою під час спроби виправити поведінку блокування $ _SESSION.
http://konrness.com/php5/how-to-prevent-blocking-php-requests/
Файл сеансу залишається заблокованим, доки сценарій не завершиться або сеанс не буде закрито вручну.
Отже, за замовчуванням сторінка повинна відкривати сеанс у режимі лише для читання. Але після того, як він відкритий лише для читання, його потрібно закрити та знову відкрити, щоб перевести його в режим запису.
const SESSION_DEFAULT_COOKIE_LIFETIME = 86400;
/**
* Open _SESSION read-only
*/
function OpenSessionReadOnly() {
session_start([
'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME,
'read_and_close' => true, // READ ACCESS FAST
]);
// $_SESSION is now defined. Call WriteSessionValues() to write out values
}
/**
* _SESSION is read-only by default. Call this function to save a new value
* call this function like `WriteSessionValues(["username"=>$login_user]);`
* to set $_SESSION["username"]
*
* @param array $values_assoc_array
*/
function WriteSessionValues($values_assoc_array) {
// this is required to close the read-only session and
// not get a warning on the next line.
session_abort();
// now open the session with write access
session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]);
foreach ($values_assoc_array as $key => $value) {
$_SESSION[ $key ] = $value;
}
session_write_close(); // Write session data and end session
OpenSessionReadOnly(); // now reopen the session in read-only mode.
}
OpenSessionReadOnly(); // start the session for this page
Тоді, коли ви йдете писати якесь значення:
WriteSessionValues(["username"=>$login_user]);
Функція бере масив пар значень key =>, щоб зробити її ще більш ефективною.
спробуйте це
if(!isset($_SESSION)){
session_start();
}
Я пропоную вам використовувати ob_start (); перед запуском будь-якої змінної sesson, це повинно замовити вам буфер браузера.
редагувати: Додано додаткову) після $ _SESSION
Жодне з наведеного не було придатним, без виклику session_start () у всіх php-файлах, які залежать від змінних $ Session, вони не будуть включені. Повідомлення настільки дратує і швидко заповнює журнал помилок. Єдине рішення, яке я можу знайти, яке працює, це це ....
error_reporting(E_ALL ^ E_NOTICE);
session_start();
Погане виправлення, але воно працює.
<?php
if ( session_id() != "" ) {
session_start();
}
По суті, вам потрібно перевірити, чи не було розпочато сеанс, перш ніж створювати інший; ... більше читання .
З іншого боку, ви вирішили знищити існуючий сеанс перед тим, як створити інший за допомогою session_destroy()
.
Просто використовуйте оператор if
if(!isset($_SESSION))
{
session_start();
}
або
перевірити стан сеансу за допомогою session_status, який повертає поточний стан сеансу, і якщо поточний сеанс вже працює, поверніться нічим іншим, якщо сеанс не працює, запустіть сеанс
session_status() === PHP_SESSION_ACTIVE ?: session_start();