Site Health: Обнаружена активная сессия PHP

1 нояб. 2020 г., 17:32:14
Просмотры: 23.1K
Голосов: 4

Я новичок в разработке WordPress и только что создал свою первую тему.

В моей панели wp-admin, "Site Health" сообщает, что обнаружена PHP сессия (критическая ошибка), вот сообщение:

PHP сессия была создана вызовом функции session_start(). Это мешает работе REST API и loopback запросам. Сессия должна быть закрыта с помощью session_write_close() перед выполнением любых HTTP запросов.

Мне нужен PHP $_SESSION для скрипта темы, и я добавил следующий код в файл functions.php для правильной инициализации сессий:

<?php

if (!session_id()) { 
    session_start(); 
}

Если я удаляю эти строки, сообщение исчезает, но мои PHP сессии перестают работать.

Если я оставляю эти строки, всё, кажется, работает правильно, но это сообщение беспокоит...

Есть ли у кого-нибудь идея, как решить эту проблему, сохранив при этом возможность использовать $_SESSION?

Моя версия WP - 5.5.3, а версия PHP - 7.4.8.

Заранее спасибо за помощь!

4
Комментарии

Я так не думаю. Скорее всего, это WordPress намекает, что вам стоит использовать что-то другое вместо $_SESSION. Либо выберите альтернативу, либо просто проигнорируйте предупреждение (если уверены, что это ничего не сломает). Думаю, можно найти способ подавить это предупреждение с помощью фильтра, если поискать.

Rup Rup
2 нояб. 2020 г. 15:25:59

Или, возможно, я неправильно понял: может быть, использовать $_SESSION допустимо, пока вы не делаете никаких внешних запросов к веб-сервисам?

Rup Rup
2 нояб. 2020 г. 15:33:30

Спасибо за помощь, Rup! Меня раздражает необходимость использовать что-то кроме $_SESSION. Может, WordPress просто не любит сессии? Подавление этого сообщения фильтром ничего не решит. Меня беспокоит, что это сообщение помечено как критическая ошибка. Я думал, что есть другой способ инициализировать и использовать сессии в WordPress, и, возможно, я делал что-то не так. Насчёт внешних запросов к веб-сервисам — не знаю, есть ли тут связь.

Loraga Loraga
2 нояб. 2020 г. 17:48:51

В моем случае проблема была вызвана плагином "Send PDF for Contact Form 7". После деактивации проблема решилась. Создал тикет поддержки у разработчика плагина.

atmomin2003 atmomin2003
12 февр. 2021 г. 00:40:23
Все ответы на вопрос 5
5

Я столкнулся с такой же проблемой.

Я заменил код

session_start();

на

if (!isset($_SESSION)) {
  session_start(['read_and_close' => true]);
}

и это сработало для меня.

29 янв. 2021 г. 06:26:27
Комментарии

Это исправит ситуацию, когда два плагина пытаются запустить сессии, но не устранит предупреждение в "Состоянии сайта", потому что WordPress вообще не рекомендует использовать session_start.

Rup Rup
29 янв. 2021 г. 11:53:57

@rup Я получал критическое предупреждение о сессиях в WordPress "Состояние сайта". Применил приведённый выше код, и это решило мою проблему.

Shiv Babbar Shiv Babbar
31 янв. 2021 г. 09:49:45

Спасибо, Шив, Если использовать ваше решение, сообщение об ошибке исчезает, но я больше не могу использовать $_SESSION в своих PHP-скриптах, они больше не инициализируются :-(

Loraga Loraga
15 февр. 2021 г. 13:43:48

@Loraga session_start ( array $options = [] ) : bool Функция session_start() создает сессию или возобновляет текущую на основе идентификатора сессии, переданного через GET или POST запрос, или через cookie. Также может быть предоставлена опция read_and_close. Если установлено значение true, это приведет к немедленному закрытию сессии после ее чтения, тем самым избегая ненужной блокировки, если данные сессии не будут изменены. Подробнее см. ссылку

Думаю, в вашем случае вам нужно начать сессию и снова поместить в нее значения.

Shiv Babbar Shiv Babbar
16 февр. 2021 г. 03:38:27

Спасибо за ссылку @shiv.

MiB MiB
21 дек. 2022 г. 17:45:38
1

В моем случае это было вызвано плагином "Contact Form by BestWebSoft".

Если вы столкнулись с такой же ситуацией, необходимо отключать плагины по одному и обновлять страницу /wp-admin/site-health.php, чтобы проверить, сохраняется ли ошибка.

Как объясняется здесь https://stackoverflow.com/questions/64377032/getting-an-active-php-session-was-detected-critical-warning-in-wordpress, это происходит из-за плохо разработанного плагина.

28 дек. 2020 г. 13:52:45
Комментарии

Спасибо, Франческо, Я уже отключил все расширения перед тем, как задать вопрос здесь, но, к сожалению, это не решило проблему. Я не использую ни одного из упомянутых расширений.

Loraga Loraga
15 февр. 2021 г. 13:46:13
1

Я обнаружил, что WP e-Store вызывает:

  1. Обнаружена активная PHP-сессия
  2. В REST API произошла ошибка

WP SpamShield вызывает:

  1. Обнаружена активная PHP-сессия

Я посмотрю код и попробую найти способ исправить это в этих плагинах. Без e-Store сайт по сути перестанет работать!

Если кто-то уже сталкивался с этими плагинами и нашёл решение, буду рад узнать, что помогло.

jshumphrey@gmail.com

13 мар. 2021 г. 05:18:32
Комментарии

Добро пожаловать на WPSE. Как правило, мы не оказываем поддержку сторонним плагинам. Однако, мне кажется, вы могли бы переформулировать свой вопрос, чтобы узнать о программном исправлении ошибки. Тем не менее, что касается багов в самих плагинах, лучше всего будет обратиться туда, где предлагается поддержка для этих плагинов.

Matthew Brown aka Lord Matt Matthew Brown aka Lord Matt
13 мар. 2021 г. 11:44:42
1

У меня была точно такая же проблема. После множества попыток подключить вызов session_start() в других местах процесса загрузки WordPress, коллега предложил мне заменить мой код в functions.php на следующий:

if(session_status() == PHP_SESSION_NONE) {
    session_start();
}

Это решение устранило обе проблемы: ошибку в WordPress и позволило пользователям на фронтенде входить в созданную мной систему.

26 июл. 2021 г. 12:35:59
Комментарии

Спасибо, @Lee. В моем случае этого оказалось недостаточно, поэтому я разработал собственное решение на основе вашего. Смотрите ответ.

MiB MiB
21 дек. 2022 г. 17:36:25
0

Благодаря ответу @Lee и ссылке @shiv на документацию PHP по session_start, я нашел решение, которое помогло решить мои проблемы. Возможно, оно также подойдет и для автора исходного вопроса.

if (session_status() == PHP_SESSION_NONE) {
    session_start([
        'cookie_lifetime' => 86400,
        'read_and_close' => true,
    ]);
}

Стоит отметить, что проблема сохранялась даже при отключенных всех плагинах.

21 дек. 2022 г. 17:40:47