9

How can I keep the user's session active, even if they accidentally closed their browser. Like in Facebook for example.

If you log in to their site and you close the tab or the browser, when you open a browser again and visits Facebook, they will automatically detect the active user and will not redirect you to the log in page.

How do I do that?

Machavity
  • 30,841
  • 27
  • 92
  • 100
freeloader
  • 336
  • 2
  • 6
  • 18

4 Answers4

27

There's two relevant settings that control session's lifetime.

The first is session.cookie-lifetime. This is the lifetime of the cookie, which by default is 0, which means the cookie is destroyed when the browser is closed. You can set a longer lifetime by increasing this variable. It is relative to the server time, so you need to account for differences in the time in your clients' machine and your server's. Assuming they were the same, setting the option to i.e. 3600 would mean the session would expire in an hour. If you want to keep the session alive for a very long time, you increase this number.

However changing this value is not enough. There's also session.gc-maxlifetime, which is the time after which the session data is seen as garbage in the storage and is destroyed. This differs from session.cookie-lifetime because this option checks the last access time of the session data, so it is relative to the time the session data was last used (i.e. when the user was last active). Even if you set your session.cookie-lifetime to a high value, it'll not be enough because session.gc_maxlifetime is relatively low usually (1440 is the default, which is only 24 minutes).

While you can set these settings both to relatively high values and have it working, I would recommend against doing so, as this will leave a lot of unnecessary session data hanging around in your session storage, due to the GC not collecting actual dead session (which also increases the chance of someone hijacking a session in a system that is not properly secured). A better approach is making a remember me cookie. Basically you assign the user's ID and some authentication token that you store in the database for each user (this is to prevent someone spoofing the cookie) in the cookie, and give it a long lifetime. In your application's initialization code you'll check if the user is logged in. If he/she is not logged in, you'll check if the remember me cookie is set. If it is, you pull the user from the database based on the user ID in the cookie, and then validate the authentication token in the db is the same one as in the cookie. If they match, you simply create the session and log the user in automatically.

reko_t
  • 55,302
  • 10
  • 87
  • 77
7

For anyone that come across this same issue, to keep the session cookie set for a long time is easy, on the login form, when you are creating the session for first time use this code, it will set the cookie time for a year (use your own time as its needed).

ini_set('session.cookie_lifetime', 60 * 60 * 24 * 365);
ini_set('session.gc-maxlifetime', 60 * 60 * 24 * 365);
session_start();

That should set the PHPSESSID cookie and your session will be safe... but is not the most secure way, so use it if you don't mind security issues

Kiba Kurogane
  • 91
  • 1
  • 3
4

By default, PHP keeps a user's session open until their browser is closed. You can override that behaviour by changing the session.cookie-lifetime INI setting:

http://www.php.net/manual/en/session.configuration.php

However please see rekot post for a full answer

juanrpozo
  • 697
  • 4
  • 8
  • Changing this value will not be enough; you also need to control `session.gc-maxlifetime` for it to work properly (see my answer for additional details) – reko_t Feb 17 '12 at 09:24
0

You should use cookies: http://php.net/manual/en/function.setcookie.php

Just store there some unique value that will help you identify the user.

Anyway, I strongly recommend you using some kind of framework, like CodeIgniter or Zend Framework, unless you're just learning how it works. It is easy to make critical mistakes in such a code and most frameworks are already well tested and safe to use.

zeroos
  • 2,094
  • 3
  • 17
  • 24
  • `setcookie` is not used in PHP sessions. Yes, you can always "roll your own" session handler, but PHP's built-in session handler is a far easier solution, and it has ways to set the session lifetime – Machavity Apr 04 '22 at 12:29