如何在PHP中设置会话生命周期?只要请求存在,我想将其设置为永久。请求是 AJAX。我处理 AJAX 请求的 PHP 代码是:
// AJAX.php
<?php
session_start();
$_SESSION['counter'] = $_SESSION['counter'] + 1;
header('Content-type: application/json');
echo json_encode(array('tick' => $_SESSION['counter']));
?>
和 JavaScript:
$(document).ready(function() {
function check() {
getJSON('ajax.php');
}
function getJSON(url) {
return $.getJSON(
url,
function(data) {
$("#ticker").html(data.tick);
}
);
}
setInterval(function() {
check();
}, 10000); // Tick every 10 seconds
});
会话始终在 300 秒后重置。
PHP 上的会话使用 Cookie 类型的会话,而在服务器端,会话信息会不断删除。
要在 php 中设置时间寿命,您可以使用函数 session_set_cookie_params,在session_start之前:
session_set_cookie_params(3600,"/");
session_start();
例如,3600 秒是一小时,对于 2 小时 3600*2 = 7200。
但它是会话cookie,浏览器可以自行过期,如果要保存大量会话(如记住登录(,则需要将数据保存在服务器中,在客户端保存标准cookie。
您可以有一个表格"会话":
- session_id int
- session_hash瓦尔查尔(20(
- session_data文本
验证 Cookie 时,您将"会话 ID"和"哈希"(为了安全起见(保存在客户端,并且可以将会话的数据保存在服务器端,例如:
登录时:
setcookie('sessid', $sessionid, 604800); // One week or seven days
setcookie('sesshash', $sessionhash, 604800); // One week or seven days
// And save the session data:
saveSessionData($sessionid, $sessionhash, serialize($_SESSION)); // saveSessionData is your function
如果用户返回:
if (isset($_COOKIE['sessid'])) {
if (valide_session($_COOKIE['sessid'], $_COOKIE['sesshash'])) {
$_SESSION = unserialize(get_session_data($_COOKIE['sessid']));
} else {
// Dont validate the hash, possible session falsification
}
}
显然,在发送数据之前保存所有会话/cookie调用。
在几秒钟内将以下 php 参数设置为相同的值:
session.cookie_lifetime
session.gc_maxlifetime
在php.ini,.htaccess或例如
ini_set('session.cookie_lifetime', 86400);
ini_set('session.gc_maxlifetime', 86400);
一天。
链接:
http://www.php.net/manual/en/session.configuration.php
http://www.php.net/manual/en/function.ini-set.php
在 PHP 7 之前,session_start(( 函数不直接接受任何配置选项。现在你可以这样做了
<?php
// This sends a persistent cookie that lasts a day.
session_start([
'cookie_lifetime' => 86400,
]);
?>
参考: https://php.net/manual/en/function.session-start.php#example-5976
可以在 php.ini 文件或 .htaccess 文件中配置。查看 PHP 会话文档。
您基本上要做的是在php中查找session.cookie_lifetime
行.ini并将其值设置为0,以便会话cookie在浏览器关闭之前有效。如果您无法编辑该文件,则可以将php_value session.cookie_lifetime 0
添加到 .htaccess 文件中。
由于大多数会话都存储在 COOKIE 中(根据上述注释和解决方案(,因此确保 COOKIE 被标记为安全会话(前面 C#(非常重要:
myHttpOnlyCookie.HttpOnly = true;
和/或 vie php.ini(从 php 5.3 开始默认为 TRUE(:
session.cookie_httponly = True
我没有在任何地方看到提到这一点,但是如果php.ini
文件具有较低的值并且服务器托管多个域/vhosts,则在PHP文件本身中设置ini_set('session.gc_maxlifetime', $max_lifetime);
通常不会产生预期的影响。 如果您在 X 网站上有 User,并且在 PHP 文件中将 maxlifetime 设置为 10 秒(不是实际值,这只是例如(,然后在 php 中将 maxlifetime 设置为 5.ini如果您有多个域/vhosts,就会发生一些有趣/意外的事情。
当第二个用户访问一个没有在其PHP文件中设置ini_set('session.gc_maxlifetime', $max_lifetime);
的网站并且它默认为php.ini
具有的任何内容时,这将导致PHP的垃圾收集使用5秒而不是10秒作为maxlife触发,从而删除用户应该持续至少10秒的会话。
因此,此设置几乎不应该进入 PHP 文件本身,如果你的设置具有此功能并且属于这种类型的场景,则实际上应该在 vhost 条目中。唯一的例外是,如果您的服务器只托管 1 个网站/虚拟主机,其 PHP 文件将始终覆盖 php.ini 拥有的任何内容。
发生这种情况是因为所有站点都使用相同的 tmp 目录来存储会话数据。 另一种缓解解决方案是为每个虚拟主机设置会话 tmp dir。 另一种(不推荐(解决方案是通过将其设置为 php.ini
完全禁用session.cookie_lifetime
0
.
只要用户不删除其cookie或关闭其浏览器,会话就应保持存在。