Какой максимальный размер может быть для $ _SESSION? - PullRequest
4 голосов
/ 08 июля 2010

Я импортирую CSV-файл, содержащий более 5000 записей. В настоящее время я делаю, получая все содержимое файла в виде массива и сохраняя их в базе данных по одному. Но в случае сбоя скрипта весь процесс будет запущен снова, и если я начну проверять их снова по одной базе данных формы, он будет использовать много запросов, поэтому я решил временно сохранить импортированные значения в сессии.

Является ли хорошей практикой хранить столько записей в сессии. Или есть другой способ сделать это?

Спасибо.

Ответы [ 6 ]

5 голосов
/ 08 июля 2010

Если вам нужно выполнить эту задачу поэтапно (и здесь есть несколько советов по улучшению способа выполнения действий за один проход), не храните файл csv в $ _SESSION ... это бессмысленные накладные расходы,потому что у вас уже есть файл csv на диске в любом случае, и он просто добавляет много издержек сериализации / десериализации в процесс при записи данных сеанса.

Вы обрабатываете записи CSV по одной,так что держите счет сколько вы успешно обработали в $ _SESSION.Если время ожидания скрипта или barfs, перезапустите и прочитайте, сколько вы уже обработали, чтобы вы знали, где в файле перезапустить.

2 голосов
/ 08 июля 2010

Какой может быть максимальный размер для $ _SESSION?

Сессия загружается в память во время выполнения - поэтому она ограничена значением memory_limit в php.ini

Является ли хорошей практикой сохранение такого большого количества записей в сеансе

Нет - по причинам, которые вы описываете, - это также сильно повлияет на производительность.

Или есть ли другой способ сделать это?

Это зависит от того, чего вы пытаетесь достичь.Большинство баз данных могут импортировать файлы CSV напрямую или поставляться с инструментами, которые сделают это быстрее и эффективнее, чем код PHP.

C.

1 голос
/ 01 сентября 2010

Чтобы ответить на фактический вопрос (кто-то только что спросил дубликат, но удалил его в пользу этого вопроса)

Обработчик данных сеанса по умолчанию сохраняет свои данные во временных файлах. Теоретически, эти файлы могут быть настолько большими, насколько позволяет файловая система.

Однако, как указывает @symcbean, данные сеанса автоматически загружаются в память скрипта при инициализации сеанса. Это ограничивает максимальный размер, который вы должны строго хранить в данных сеанса. Кроме того, загрузка большого количества данных оказывает огромное влияние на производительность.

Если у вас есть огромные объемы данных, которые необходимо сохранить для подключения к сеансу, я бы рекомендовал использовать временные файлы, которые вы называете по текущему идентификатору сеанса. После этого вы можете работать с этими файлами по мере необходимости и в рамках скрипта memory_limit.

.
1 голос
/ 08 июля 2010

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

Я предлагаю использовать следующее решение:

  1. Держите CSV-файл где-то рядом
  2. начинайте транзакцию
  3. запускайте вставки
  4. коммит после того, как все вставки сделаны
  5. endтранзакции

Ссылка: Синтаксис транзакции MySQL

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

0 голосов
/ 12 февраля 2014

Зависит от размера файла операционной системы. Независимо от размера сеанса, на странице по умолчанию установлено 128 МБ.

0 голосов
/ 08 июля 2010

Если вы используете Postgresql, вы можете использовать один запрос, чтобы вставить их все, используя pg_copy_from., Или вы можете использовать pg_put_line, как показано в примере (копия из stdin), который я нашел очень полезно при импорте тонн данных.

Если вы используете MySql, вам придется сделать несколько вставок. Не забудьте использовать транзакции, так что если вы используете транзакции, если ваш запрос не будет выполнен, он будет отменен, и вы сможете начать заново. Обратите внимание, что 5000 строк не так велики! Однако вы должны знать об ограничении max_execution_time, которое убьет ваш скрипт через несколько секунд.

Что касается сессии, я считаю, что вы ограничены максимальным объемом памяти, который может использовать скрипт (memory_limit в php.ini). Данные сеанса сохраняются в файлах, поэтому следует учитывать также использование дискового пространства, если подключено много клиентов.

...