我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

PHP编程中,配置会话(Session)的 Cookie属性是一个常见需求,尤其是在需要增强安全性时。在本文中,苏南大叔将通过两个示例文件,对比使用 session_set_cookie_params()ini_set() 配置【会话Cookie】的方式。看看那种方式更加适合你。

苏南大叔:php会话Cookie定制,session_set 对比 ini_set - php会话cookie定制
php会话Cookie定制,session_set 对比 ini_set(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10chrome@135.0.7049.41php@8.2.9nts。【会话cookie】,就是专门用来从客户端cookie自动转化为服务端session的一个特殊cookie

前文回顾

在苏南大叔的文章里面,写过php如何定制cookie

本文介绍的是由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.";

苏南大叔:php会话Cookie定制,session_set 对比 ini_set - 第一种代码session_set_cookie_params
php会话Cookie定制,session_set 对比 ini_set(图3-2)

优点:

  • 专注于会话 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会话Cookie定制,session_set 对比 ini_set - 第二种代码ini_set()
php会话Cookie定制,session_set 对比 ini_set(图3-3)

优点:

  • 通用性强,可以修改任何支持的 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相关文字,请参考下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    cookie