Неопределенная переменная: $_SESSION

Я собираюсь E_NOTICE ошибки в основном файле CakePHP, когда он пытается сослаться на никогда не установленный или неустановленный сеанс (cake/libs/cake_session.php line 372):

function read($name = null) {
    if (is_null($name)) {
        return $this->__returnSessionVars();
    }
    if (empty($name)) {
        return false;
    }
    $result = Set::classicExtract($_SESSION, $name);
}

Я выполнил поиск по моему коду (в каталоге app/) и не могу найти ссылки на $_SESSION или же session_destroy, Я что-то пропустил?

Эта ошибка появляется, когда я пытаюсь запустить какие-либо модульные тесты. Это нормально? Я очистил cake/ каталог и заменил его другой (той же версии), просто чтобы убедиться, что я случайно не изменил что-либо в файлах ядра, но я все еще получаю ту же ошибку. Я не уверен, является ли это просто недостатком в структуре или чем-то еще.

РЕДАКТИРОВАТЬ

Вот результаты тестового запуска в командной строке:

Welcome to CakePHP v1.3.11 Console
---------------------------------------------------------------
App : app
Path: /var/www/program/app
---------------------------------------------------------------
CakePHP Test Shell
---------------------------------------------------------------
Running app case models/owners_equity
E_NOTICE: Undefined variable: _SESSION in /var/www/program/cake/libs/cake_session.php on line 372
E_NOTICE: Undefined variable: _SESSION in /var/www/program/cake/libs/cake_session.php on line 372
ERROR->Unexpected PHP error [Undefined variable: _SESSION] severity [E_NOTICE] in [/var/www/program/cake/libs/cake_session.php line 372]
    in testGenerateOwnerWithdrawals
    in BalanceTestCase
    in /var/www/program/app/tests/cases/models/owners_equity.test.php

ERROR->Unexpected PHP error [Undefined variable: _SESSION] severity [E_NOTICE] in [/var/www/program/cake/libs/cake_session.php line 372]
    in testGenerateOwnerWithdrawals
    in BalanceTestCase
    in /var/www/program/app/tests/cases/models/owners_equity.test.php

4 ответа

Решение

Оказалось, что в AppModel был какой-то дополнительный код, который все испортил:

в beforeFind а также afterFind:

App::Import("Session");
$session = new CakeSession();
$sim_id = $session->read("Simulation.id");

Я не знаю почему, но в этом была проблема. Удаление этих строк устранило проблему, с которой я столкнулся.

Вы должны обязательно начать сеанс в верхней части каждого файла PHP, где вы хотите использовать $_SESSION суперглобальный. Как это:

<?php
  session_start();
  echo $_SESSION['youritem'];
?>

Вы забыли сессию HELPER.

Проверьте эту ссылку: http://book.cakephp.org/2.0/en/core-libraries/helpers/session.html

Другая возможность для этого предупреждения (и, скорее всего, проблем с поведением приложения) заключается в том, что исходный автор приложения полагался на session.auto_start включен (по умолчанию выключен)

Если вы не хотите возиться с кодом и просто хотите, чтобы он работал, вы всегда можете изменить конфигурацию php и перезапустить php-fpm (если это веб-приложение):

/etc/php.d/my-new-file.ini:

session.auto_start = 1

(Это верно для CentOS 8, с учетом вашей ОС / упаковки)

Для тех, у кого есть эта проблема в CakePHP 4.x:

      Argument 1 passed to Cake\Http\Session::_overwrite() must be of the type array, null given, called in /opt/lampp/htdocs/rondeel/vendor/cakephp/cakephp/src/Http/Session.php on line 513

Я тестировал свою форму аутентификации и использовал оператор отладки для публикации данных формы. Оказывается, это приводит к отправке заголовков до начала сеанса, что вызывает Cake\Http\Session::start() способ отказа:

      if (ini_get('session.use_cookies') && headers_sent()) {
    return false;
}

Решение: убедитесь, что ничего не эхо и не отладили до начала сеанса.

Другие вопросы по тегам