Приветствую! Создаю свой 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));}
В какой версии opencart работает? Какой адаптер сессии выбран? Зачем делать session_start(); ?? session_write_close(); ?? В опенкарте два метода сессии которые используются это чтение и запись (не считая удаления) смотрим в system\library\session.php
ocStore 2.3 На счёт адаптера сессий - затрудняюсь в ответе, откровенно говоря, даже не знаю где посмотреть, но скорее всего "native". В указанном Вами файле вижу только методы: start() - создание сессии; getId() - получение идентификатора сессии; createId() - создание идентификатора сессии; destroy() - удаление сессии , не считая конструктора.
К сожалению, я не понимаю, как произвести запись данных в сессию, используя Session\Native. PHP: $this->session->adaptor->write($this->session->session_id, $data); Но куда записывается $data? Делаю var_dump() объекта сессии - там нету данных.
По умолчанию в 2.3 используется нативный метод. В любом случаи, дополнительно делать старт сессии нет смысла скорей всего. Лучше уж как обычно, без использования библиотеки опенкарта session А вы все смешали... Вам принципиально использовать сессии? Попробуйте свой метод.. например запись в файл своего лога.
Ну, мне нужно "что бы работало" : ) Чтение/запись в лог (теоретически) не будет быстрым, хотя, как вариант - попробовать можно.
В итоге файлы тоже не помогли, пытался ещё использовать буфер вывода - не работает. Жаль что пыха не асинхронная
fflush использовали? если нет, то там такой же механизм как и с сессиями. данные накапливаются в буфере и сбрасываются в файл только по окончании работы скрипта. как вариант еще писать прогресс в базу