2016-03-24 7 views
0

Мы используем Guzzle HTTP для того, чтобы сделать запрос HTTP (-ов), чтобы сгенерировать CSV-файл; Другим компонентом, который мы используем, является переменная $_SESSION для хранения информации о состоянии создания разных файлов.Блокирование хранения сеанса

Основная проблема с этим подходом заключается в том, что PHP блокирует все другие запросы, которые используют использование переменной $_SESSION. Мы знаем, что мы можем победить эту «проблему» с определенной функцией, которая называется session_write_close();

Но мы все равно должны иметь возможность обновлять информацию и хранить ее в переменной $_SESSION позже, и мы также должны быть в состоянии использовать информацию $_SESSION в других разделах сайта; Таким образом, он должен быть «синхронизирован».

+0

Вы всегда можете начать сеанс позже в сценарии, написать ему и снова закрыть его. Это значительно сократит блокировку. – rjdown

ответ

0

PHP сессия реализована при условии, что данные сеанса:

  1. груза в полном объеме из резервного хранилища.
  2. Возможно, изменено во время выполнения скрипта.
  3. Написано целиком в своем магазине поддержки.

Итак, предположим, что вы реализуете обработчик сеанса, который не реализует блокировку, и имеет место следующая последовательность событий.

  1. Запрос Загружает данные сеанса из хранилища.
  2. Запрос B загружает данные сеанса из хранилища резервных копий.
  3. запрос изменяет $ _SESSION [ «Foo»]
  4. запрос B занят делать вещи ...
  5. запроса завершается, и записывает сеанс в резервном хранилище.
  6. Запрос B завершает и записывает сеанс в хранилище, стирает изменения, сделанные A.

Именно поэтому обработчик сеанса PHP по умолчанию и любой другой обработчик сеанса, заслуживающий его соли, блокирует каждый сеанс в течение всего заданного запроса.

Учитывая, что вам необходимо записать данные в конце долговременного запроса, а также выполнить несколько параллельных запусков параллельно, вы, вероятно, не должны использовать сеансы вообще для этих данных, и я бы предложил использовать базу данных и сделки.

+0

Возможно, это лучшее решение для нашей проблемы, единственная проблема заключается в том, что мы не должны использовать базу данных вообще. Таким образом, мы будем переоценивать наши варианты. В настоящее время мы закрываем и снова открываем наши «_SESSION» соединения каждый раз, но это довольно неудобно. –

0

Печально session_write_close - это именно то, что вам нужно использовать, чтобы убедиться, что запрос не блокируется. Мое предложение состоит в том, чтобы получить и установить всю необходимую информацию сеанса в начале сценария, прежде чем вы начнете генерировать свой CSV. Затем позвоните session_write_close и продолжайте создание файла CSV.

+0

Проблема с этим подходом заключается в том, что нам нужно обновить статус генерации CSV позже в скрипте. –

+0

Если вам нужно обновить его в данных сеанса, тогда да. Вы должны решить, какое из двух последствий - меньшее зло. – Technoh

0

Проблема в том, что ваш запрос занимает гораздо больше времени, чем типичный запрос. Причиной является время, необходимое для выполнения HTTP-запросов из вашего сценария. Это приводит к исходной проблеме с блокировкой файла сеанса.

Я вижу два решения вашей проблемы:

  1. Разгрузка вашей логики, связанную с принятием запросов в другой процесс, который передается вся информацией, необходимой без фактического использования сессии (рабочего). Это может быть достигнуто путем использования очередей или даже простого скрипта cron, который подглядывает то, что ему нужно делать из какого-то общего хранилища, например DB.

  2. Откажитесь от использования сеансов или, по крайней мере, для использования блокирующего хранилища для сеансов. Хорошими альтернативами могут быть: простая таблица DB с необходимой информацией, хранилища с ключевыми значениями, такие как memcached или Redis.

Смежные вопросы