Каков максимальный размер $_SESSION?

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

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

Спасибо.


person Chetan Sharma    schedule 08.07.2010    source источник
comment
см. stackoverflow.com/questions/1755348/   -  person Haim Evgi    schedule 08.07.2010
comment
@haim evgi: неприменимо, поскольку ваша ссылка относится к сеансам ASP.NET, этот вопрос касается сеансов PHP.   -  person Morfildur    schedule 08.07.2010
comment
Извините, я был сбит с толку, потому что увидел ответ Исмаэля, который говорил о php   -  person Haim Evgi    schedule 08.07.2010
comment
Как насчет LOAD DATA INFILE (dev.mysql.com/ doc/refman/5.5/en/load-data.html#id2269472) ?   -  person Kuchen    schedule 08.07.2010


Ответы (6)


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

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

person Mark Baker    schedule 08.07.2010

Каков максимальный размер $_SESSION?

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

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

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

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

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

C.

person symcbean    schedule 08.07.2010

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

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

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

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

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

person Morfildur    schedule 08.07.2010
comment
У меня нет контроля над запросами, так как я использую Elgg Framework. Но это действительно хороший способ решить такого рода проблемы. Спасибо - person Chetan Sharma; 08.07.2010

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

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

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

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

person Pekka    schedule 01.09.2010

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

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

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

person Palantir    schedule 08.07.2010

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

person Kabir Hossain    schedule 12.02.2014