#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, и это сработало.
Как правило, очистил свой объект, чтобы он содержал только необходимые подобъекты, необходимые для завершения экспорта.