关闭浏览器时是否可以防止php会话被破坏


Is it possible to prevent php session from destroying when you close browser?

我们希望使用会话而不是cookie来跟踪一些事情。然而,当我关闭浏览器,重新打开一个页面以响应会话var时,它并不存在(这就是它应该存在的情况)。有没有可能用一些魔法或其他东西来防止这种情况发生?

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

任何知识都将不胜感激。

正确的方法是使用数据库,您可以模拟或控制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只是识别客户端。

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

手动重置会话cookie。

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

您可以使用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();

注意:

  • 您也可以通过编辑php.ini全局更改会话选项-会话配置选项

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

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

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

注意其他答案:所有答案都提到了延长会话cookie到期时间的方法,这不会克服关闭浏览器窗口时的常规行为。