是否可以阻止php会话在关闭浏览器时销毁?

时间:2016-05-11 01:04:01

标签: php session

我们希望使用会话而不是cookie来跟踪一些事情。但是,当我关闭浏览器并重新打开一个页面以回显会话变量时,它不存在(这就是它的假设)。有可能通过一些魔法或任何东西防止这种情况发生吗?

这不是一个重复的问题,我看到的是人们想要破坏会话,我想做相反的事情并尽可能长时间地保留会话。

任何知识都将不胜感激。

4 个答案:

答案 0 :(得分:1)

正确的方法是使用数据库,您可以模仿或控制php会话并将它们存储在数据库中而不是存储在文件中(正常情况下)。然后,一旦掌握了数据,您就可以通过IP地址更新会话,或者更好地登录。

所以说用户登录然后你需要存储一些数据,你将它存储在会话中但是php会将它存储在你的数据库表中(如果配置正确)。用户回来后,​​最初任何访问者都会获得一个新的会话,但是一旦他们登录,您就可以检索他们过去的会话。对于客户端是否或何时删除过期的cookie,您通常无法控制。

这个主题太过广泛,不能只提供几个示例代码,但我确实找到了关于该主题的小文章。

http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/

它的内容是使用此函数session_set_save_handler

http://php.net/manual/en/function.session-set-save-handler.php

一旦掌握了数据,你可以随心所欲地做任何事情,但是我会提醒你只依赖于IP地址,最好使用登录系统来做这样的事情以防止提供会话错误的访客。

您无法可靠地控制客户端发生的情况,即使使用单独的cookie也不可靠,并且存在将数据存储在可以访问它的客户端而不是将其保留在服务器上的缺点。会话由cookie控制,但其中的数据仍保留在您的服务器上,cookie只标识客户端。

  • 作为旁注,我个人不喜欢使用会话。可以在网址中存储您需要的内容,然后将其添加为书签。经典示例将是搜索表单的输入(通过$ _GET)或用于分页目的。如果它不是安全数据,那么这样做没有错。会话的问题是,如果数据是针对某个页面的,例如我的经典示例"或者对于分页,您只能获得一个会话,因此您一次只能拥有一组搜索数据,在网址中您可以同时打开多组搜索数据。这说明它在很大程度上取决于你需要保存或坚持的东西。

答案 1 :(得分:0)

您可以使用session.gc_maxlifetimesession_set_cookie_params,即:

// server should keep session data for AT LEAST 1 Year
ini_set('session.gc_maxlifetime', 3600 * 24 * 365);

// each client should remember their session id for EXACTLY 1 Year
session_set_cookie_params(3600 * 24 * 365);

session_start();

注意:

答案 2 :(得分:0)

手动重置会话cookie。

$lifetime=60*60; // duration in seconds
session_start();
setcookie(session_name(),session_id(),time()+$lifetime);

答案 3 :(得分:-1)

PHP会话使用session cookies。浏览器有自己的处理方式,但如果你关闭浏览器,他们都认为它们是垃圾。

会话cookie不能也不能持久化。如果您需要持久性cookie,只需使用常规cookie来保存服务器可识别的用户识别码,并将其会话信息保存在索引该ID码的数据库或平面文件中。

请注意,在服务器上累积会话会逐渐导致重要的性能和安全问题。

关于其他答案的注释:所有这些都提到了扩展会话cookie过期的方法,这种方法在关闭浏览器窗口时无法克服常规行为。