php会话Cookie定制,session_set 对比 ini_set
发布于 作者:苏南大叔 来源:程序如此灵动~

在PHP
编程中,配置会话(Session
)的 Cookie
属性是一个常见需求,尤其是在需要增强安全性时。在本文中,苏南大叔将通过两个示例文件,对比使用 session_set_cookie_params()
和 ini_set()
配置【会话Cookie
】的方式。看看那种方式更加适合你。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10
,chrome@135.0.7049.41
,php@8.2.9nts
。【会话cookie
】,就是专门用来从客户端cookie
自动转化为服务端session
的一个特殊cookie
。
前文回顾
在苏南大叔的文章里面,写过php
如何定制cookie
。
- https://newsn.net/say/php-cookie.html
- https://newsn.net/say/php-cookie-header.html
- https://newsn.net/say/php-cookie-samesite.html
- https://newsn.net/say/php-session.html
本文介绍的是由session_start()
被动设置的【会话cookie
】,和前几篇文章里面的cookie
,还是有些区别的。
session_set_cookie_params()
test.php: 使用 session_set_cookie_params()
。代码如下:
function is_https() {
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ||
(!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
}
// 设置自定义会话名称
session_name('MyCustomSession');
// 设置会话 Cookie 参数,包括 SameSite 属性
session_set_cookie_params([
'lifetime' => 3600, // 1 小时
'path' => '/',
'domain' => $_SERVER['HTTP_HOST'], // 动态设置域名
'secure' => is_https(), // 根据是否 HTTPS 设置 secure 属性
'httponly' => true, // 防止 JavaScript 访问
'samesite' => 'Lax' // 设置 SameSite 属性
]);
// 启动会话
session_start();
if (isset($_SESSION['who'])) {
$_SESSION["who"] = "sunan" . date("His");
echo $_SESSION['who'];
} else {
$_SESSION['who'] = 'Hello, World!';
echo $_SESSION['who'];
}
echo "<br/>Session started with custom name: " . session_name() . " and SameSite=Lax.";
优点:
- 专注于会话 Cookie 的配置,语义化更强。
- 支持通过数组一次性设置多个参数,代码更简洁。
- 不会影响其他非会话相关的配置。
缺点:
- 仅适用于会话相关的配置,无法修改其他 PHP 配置项。
ini_set()
test2.php: 使用 ini_set()
。实现的功能一样,但是代码有明显不同。
function is_https() {
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ||
(!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
}
// 使用 ini_set() 设置会话相关的配置
ini_set('session.name', 'MyCustomSession'); // 设置自定义会话名称
ini_set('session.cookie_lifetime', 3600); // 1 小时
ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', $_SERVER['HTTP_HOST']); // 动态设置域名
ini_set('session.cookie_secure', is_https() ? '1' : '0'); // 根据是否 HTTPS 设置 secure 属性
ini_set('session.cookie_httponly', '1'); // 防止 JavaScript 访问
ini_set('session.cookie_samesite', 'Lax'); // 设置 SameSite 属性
// 启动会话
session_start();
if (isset($_SESSION['who'])) {
$_SESSION["who"] = "sunan" . date("His");
echo $_SESSION['who'];
} else {
$_SESSION['who'] = 'Hello, World!';
echo $_SESSION['who'];
}
echo "<br/>Session started with custom name: " . session_name() . " and SameSite=Lax.";
优点:
- 通用性强,可以修改任何支持的 PHP 配置项。
- 适用于需要动态调整全局配置的场景。
缺点:
- 配置项需要逐项调用
ini_set()
,代码较为冗长。 - 不够专注于会话,可能影响其他全局配置。
对比分析
特性 | session_set_cookie_params() | ini_set() |
---|---|---|
用途 | 专门用于设置会话 Cookie 的属性 | 通用配置修改,包括会话相关的配置 |
语义化 | 更加语义化,专注于会话 Cookie | 通用性强,但不专注于会话 |
作用范围 | 仅影响当前,调用 session_start() 的会话 Cookie | 影响当前脚本的全局配置 |
SameSite | 是(PHP 7.3+) | 是(PHP 7.3+) |
动态配置能力 | 支持动态传递数组参数,配置更直观 | 需要逐项调用 ini_set() 配置 |
推荐使用场景 | 配置会话相关的 Cookie | 修改全局配置或非会话相关的配置 |
选择建议
使用场景:
- 如果你的目标是专注于会话 Cookie 的配置,推荐使用
session_set_cookie_params()
,因为它更语义化且专注于会话。 - 如果需要修改更广泛的 PHP 配置(包括但不限于会话),可以使用
ini_set()
。
代码维护:
session_set_cookie_params()
的代码更简洁,适合需要频繁调整会话 Cookie 参数的场景。ini_set()
更灵活,但代码可读性稍差,适合需要动态调整多种配置的复杂场景。
总结
根据实际需求选择合适的方式。如果你的 PHP
版本支持 session_set_cookie_params()
的数组参数(PHP 7.3+),优先推荐使用它来配置会话Cookie
。
更多苏南大叔的php
相关文字,请参考下面的链接:


