Проблема сеанса PHP 8 с сериализацией объектов

#php #object #session #php-8

Вопрос:

Я столкнулся с очень странной проблемой сеанса на PHP 8(хотя она также не работает с 7.4, но на 7.3 она отлично работает).

Я создаю класс, в котором настраиваю объект экспорта и сохраняю его в сеансе $_SESSION[‘AjaxExport’][идентификатор сеанса]. Теперь я хочу загрузить этот объект, хранящийся по ссылке, в ifram, который обрабатывает экспорт. Когда я запускаю session_start, он вообще не загружает сеанс.

 AjaxExporter Class
private function ExportIntro(){
        
        while (ob_end_clean());

        // remove any old ajax exports
        unset($_SESSION['AjaxExport']);

        $rnd = rand(1, 99999);
        $this->sessionid = uniqid($rnd, true);

        $_SESSION['AjaxExport'][$this->sessionid] = amp;$this;
 

Выше загружается модал, в котором пользователь получает ссылку для запуска экспорта. нажав на эту ссылку, я загружаю нижеприведенную функцию, которая загружает объект из сеанса, и начинаю экспорт с автоматической перезагрузки, чтобы экспортировать в процессе, например (10% -20%…)

 class NG_ADMIN_AJAXEXPORTER_CONTROLLER extends NG_ADMIN_BASE {
    public function Export()
    {

        $sessionid = '';

        if (!empty($_REQUEST['exportsess']) amp;amp; isset($_SESSION['AjaxExport'][$_REQUEST['exportsess']])) {
            $sessionid = $_REQUEST['exportsess'];
        }
        else {
            return;
        }

        $exporter = amp;$_SESSION['AjaxExport'][$sessionid];
        $exporter->sessionid = $sessionid;
        $exporter->HandleToDo($_REQUEST['action']);
    }
}
 

Когда процесс пытается начаться, я вообще не получаю сеанса.
session_start(): Не удалось декодировать объект сеанса. Сеанс был уничтожен в…

Также пытался реализовать Seriazable в обоих классах, но это тоже не работает, потому что, несмотря на то, что объект сохранен, в его свойствах нет значений, поэтому он бесполезен (хотя я использовал ссылку amp;).

Как я уже упоминал выше, этот код отлично работает в php 7.3, проблемы начались с 7.4 и php 8

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

1. У вас запущено несколько запросов? если вы используете обработчик сеанса PHP по умолчанию, первый запрос заблокирует файл сеанса. ( У меня была проблема с использованием пользовательского сеанса с использованием MySQL, где длинный запрос перезаписал бы более новый более быстрый запрос). P. s. объекты всегда находятся по ссылке, поэтому вам не нужно «amp;» при назначении $this сеансу

2. Нет, я не выполняю несколько запросов. Также проверьте это, происходит нечто подобное, bugs.php.net/bug.php?id=79031

Ответ №1:

Итак, наконец-то разобрался в этом.

Как сказал мне друг, если класс имеет статические свойства, сериализация может не работать, и я загружал Twig v3 в родительский класс, поэтому я уничтожил все свойства, которые могли содержать свойство «шаблон» из Twig, и это сработало.

Как правило, очистил свой объект, чтобы он содержал только необходимые подобъекты, необходимые для завершения экспорта.