Не получается перезаписать переменную в сессии.

Тема в разделе "Модули и дополнения", создана пользователем Panda58dev, 2 апр 2022.

  1. Panda58dev

    Panda58dev Новичок

    Сообщения:
    13
    Симпатии:
    0
    Приветствую! Создаю свой progress bar, т.к. скрипт выполняется довольно долго. Т.к. все мы знаем, что пыха делает вывод, только при окончании работы скрипта приходится использовать такие костыли и проверять содержимое сессии. Кратко опишу алгоритм: один экшн выполняет тяжёлый скрипт, при выполнении некоторых задач меняет $this-session->data['progress'], второй экшн проверяет эту переменную и возвращает её содержимое. Так же имеем два аякс метода: первый запускает тяжёлый скрипт, второй проверяет каждые полсекунды состояние переменной сессии. Собственно беда, заключается в том, что в эту переменную сессии значение записывается 1 раз, но после session_write_close(), поменять это значение не получается, даже используя session_start().

    Вот примерный код:
    PHP:
    function longAction() {
        
    session_start();
        
    $this->session->data['progress'] = 10;
        
    session_write_close();

        
    //code...

        
    session_start();
        
    $this->session->data['progress'] = 80;
        
    session_write_close();
        
    //code...
    }

    //Проверяем значение переменной в сессии
    function checkLoading() {
        
    $progress $this->session->data['progress'] . '%';

        
    $this->response->addHeader('Content-Type: application/json');
        
    $this->response->setOutput(json_encode($progress));
    }
     
  2. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    В какой версии opencart работает? Какой адаптер сессии выбран?
    Зачем делать session_start(); ?? session_write_close(); ??
    В опенкарте два метода сессии которые используются это чтение и запись (не считая удаления)
    смотрим в system\library\session.php
     
  3. Panda58dev

    Panda58dev Новичок

    Сообщения:
    13
    Симпатии:
    0
    ocStore 2.3
    На счёт адаптера сессий - затрудняюсь в ответе, откровенно говоря, даже не знаю где посмотреть, но скорее всего "native".
    В указанном Вами файле вижу только методы:
    • start() - создание сессии;
    • getId() - получение идентификатора сессии;
    • createId() - создание идентификатора сессии;
    • destroy() - удаление сессии
    , не считая конструктора.
     
  4. Panda58dev

    Panda58dev Новичок

    Сообщения:
    13
    Симпатии:
    0
    Методы "записи"/"чтения" нашёл в файле адаптера, сейчас буду пробовать...
     
  5. Panda58dev

    Panda58dev Новичок

    Сообщения:
    13
    Симпатии:
    0
    К сожалению, я не понимаю, как произвести запись данных в сессию, используя Session\Native.
    PHP:
    $this->session->adaptor->write($this->session->session_id$data);
    Но куда записывается $data? Делаю var_dump() объекта сессии - там нету данных.
     
  6. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    По умолчанию в 2.3 используется нативный метод. В любом случаи, дополнительно делать старт сессии нет смысла скорей всего.

    Лучше уж как обычно, без использования библиотеки опенкарта session
    А вы все смешали...

    Вам принципиально использовать сессии? Попробуйте свой метод.. например запись в файл своего лога.
     
    Последнее редактирование: 2 апр 2022
    Panda58dev нравится это.
  7. Panda58dev

    Panda58dev Новичок

    Сообщения:
    13
    Симпатии:
    0
    Ну, мне нужно "что бы работало" : )
    Чтение/запись в лог (теоретически) не будет быстрым, хотя, как вариант - попробовать можно.
     
  8. Panda58dev

    Panda58dev Новичок

    Сообщения:
    13
    Симпатии:
    0
    В итоге файлы тоже не помогли, пытался ещё использовать буфер вывода - не работает. Жаль что пыха не асинхронная :(
     
  9. Blast

    Blast Продвинутый пользователь

    Сообщения:
    212
    Симпатии:
    74
    fflush использовали? если нет, то там такой же механизм как и с сессиями. данные накапливаются в буфере и сбрасываются в файл только по окончании работы скрипта.
    как вариант еще писать прогресс в базу
     
  10. Panda58dev

    Panda58dev Новичок

    Сообщения:
    13
    Симпатии:
    0
    Пробовал - не получается. В итоге сделал псевдо-загрузку. Главное что шевелится и ладно.