Я импортирую файл csv с более чем 5000 записей в нем. То, что я делаю сейчас, – это получение всего содержимого файла в виде массива и сохранение их в базе данных по одному. Но в случае сбоя скрипта весь процесс снова запустится, и если я начну проверять их снова по одной базе данных формы, он будет использовать множество запросов, поэтому я решил временно сохранить импортированные значения в сеансе.
Хорошая практика заключается в том, чтобы хранить большую часть записей в сеансе. Или есть ли другой способ сделать это?
Спасибо.
Если вам нужно выполнить эту задачу поэтапно (и есть несколько предложений здесь, чтобы улучшить способ выполнения действий за один проход), не держите файл csv в $ _SESSION … это бессмысленные накладные расходы, потому что вы уже в любом случае, есть файл csv на диске, и это просто добавляет много процесса сериализации / unserialization в процесс, когда записываются данные сеанса.
Вы обрабатываете записи CSV по одному, поэтому храните подсчет количества успешных обработок в $ _SESSION. Если сценарий истекает или barfs, перезапустите и прочитайте, сколько вы уже обработали, чтобы вы знали, где в файле перезагрузиться.
Каков максимальный размер для $ _SESSION?
Сеанс загружается в память во время выполнения – поэтому он ограничен memory_limit в php.ini
Хорошая практика заключается в том, чтобы хранить большую часть записей в сеансе
Нет – по причинам, которые вы описываете, это также будет иметь большое влияние на производительность.
Или есть ли другой способ сделать это?
Это зависит от того, чего вы пытаетесь достичь. Большинство баз данных могут импортировать файлы CSV напрямую или поставляться с инструментами, которые будут делать это быстрее и эффективнее, чем PHP-код.
C.
Это нехорошая идея imho, поскольку данные сеанса будут сериализованы / неэтериализованы для каждого запроса страницы, даже если они не связаны с действием, которое вы выполняете.
Я предлагаю использовать следующее решение:
Ссылка: Синтаксис транзакции MySQL
Если что-то не удастся, вставки будут отброшены назад, чтобы вы знали, что можете безопасно переделать вставки, не беспокоясь о дублированных данных.
Чтобы ответить на фактический вопрос (кто-то просто спросил дубликат, но удалил его в пользу этого вопроса)
Обработчик данных сеанса по умолчанию хранит свои данные во временных файлах. Теоретически эти файлы могут быть такими же большими, как позволяет файловая система.
Однако, как указывает @symcbean, данные сеанса автоматически загружаются в память сценария при инициализации сеанса. Это ограничивает максимальный размер, который вы должны хранить в данных сеанса. Кроме того, загрузка большого количества данных оказывает огромное влияние на производительность.
Если у вас есть огромное количество данных, которые необходимо сохранить для подключения к сеансу, я бы рекомендовал использовать временные файлы, которые вы называете текущим идентификатором сеанса. Затем вы можете обращаться с этими файлами по мере необходимости и, насколько это возможно, в пределах памяти memory_limit
скрипта.
Если вы используете Postgresql, вы можете использовать один запрос, чтобы вставить их все с помощью pg_copy_from., Или вы можете использовать pg_put_line, как показано в примере (копия из stdin), который я нашел очень полезным при импорте тонны данных.
Если вы используете MySql, вам придется делать несколько вставок. Не забудьте использовать транзакции, чтобы, если вы используете транзакции, если ваш запрос не выполняется, он будет отменен, и вы сможете начать все заново. Обратите внимание, что 5000 строк не так уж и велики! Тем не менее, вы должны знать об ограничении max_execution_time, которое будет убивать ваш скрипт через несколько секунд.
Что касается СЕССИИ, я считаю, что вы ограничены максимальным объемом памяти, которую может использовать скрипт (memory_limit в php.ini). Данные сеанса сохраняются в файлах, поэтому вы должны учитывать также использование дискового пространства, если подключено много клиентов.
Это зависит от размера файла операционной системы. Независимо от размера сеанса на каждую страницу по умолчанию составляет 128 МБ.