Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it good practice to store large Data in session variable?

Tags:

php

mysql

session

I am currently programming a php site, which atm needs to query a large amount of data (about 4 - 5MB) everytime. I already have a session going and wanted to ask, if its good practice to store that data in the session variable?

The current plan is to also maintain a table in the Database containing when a table has changed last. If that timestamp would be newer, then the data would be queried again, if not, use the data of the session variable as its still consistent...

Is this a good way to avoid querying too much data? And what speed impacts would the site have when a session is about 5MB in size?

Thanks in advance!

like image 874
Nidhoegger Avatar asked Sep 08 '15 13:09

Nidhoegger


2 Answers

It's not really good practice (it will make PHP chew far more memory than it really should), but I'm not sure how it will affect performance.

I suppose the real question is this: Why do you need to store so much in the session? If it's information that is meant to be accessible between sessions, then you should be storing it in a database and loading it 'at need'.

If it's binary data (images, files, etc.) that are only relevant while the session is valid, then store it in a temporary file for the user (look at tempnam() and sys_get_temp_dir()), then store the temporary filename on the session.

like image 106
samlev Avatar answered Sep 28 '22 03:09

samlev


No, it's not good practice to do this.

Points to consider:

  • By defailt, the session data is stored on disk in a temp folder. Every time you call session_start() (ie every page load), it will have to load the whole of that data into memory and populate it into the session array. If you're loading large amounts of data, this could have performance implications.

  • Also, since you're loading this large chunk of data every time, it means that each page load will take more memory. This reduces the number of concurrent users that your server can support.

  • If you're doing this for caching purposes to reduce hits to your DB, there are much better solutions available. APCu, Memcache, Redis and others can all do a much better job of caching your data than your proposed custom-written solution. There are also wrapper libraries available that make it even easier and allow you to mix and match between caching solutions. If you're using a framework like Laravel or Symphony, there may be caching classes built into your framework. Alternatively, you could try a stand-alone library like phpFastCache. But also, don't forget that modern DB engines have their own caching mechanisms built in, so repeated calls to the same or similar queries should be reasonbly fast anyway.

like image 40
Simba Avatar answered Sep 28 '22 03:09

Simba