运行时配置

这些函数的行为受 php.ini 中的设置影响。

会话配置选项
名称 默认值 可更改 变更日志
session.save_path "" INI_ALL  
session.name "PHPSESSID" INI_ALL  
session.save_handler "files" INI_ALL  
session.auto_start "0" INI_PERDIR  
session.gc_probability "1" INI_ALL  
session.gc_divisor "100" INI_ALL  
session.gc_maxlifetime "1440" INI_ALL  
session.serialize_handler "php" INI_ALL  
session.cookie_lifetime "0" INI_ALL  
session.cookie_path "/" INI_ALL  
session.cookie_domain "" INI_ALL  
session.cookie_secure "0" INI_ALL 在 PHP 7.2.0 之前,默认值为 ""
session.cookie_httponly "0" INI_ALL 在 PHP 7.2.0 之前,默认值为 ""
session.cookie_samesite "" INI_ALL 自 PHP 7.3.0 起可用。
session.use_strict_mode "0" INI_ALL  
session.use_cookies "1" INI_ALL  
session.use_only_cookies "1" INI_ALL  
session.referer_check "" INI_ALL  
session.cache_limiter "nocache" INI_ALL  
session.cache_expire "180" INI_ALL  
session.use_trans_sid "0" INI_ALL  
session.trans_sid_tags "a=href,area=href,frame=src,form=" INI_ALL 自 PHP 7.1.0 起可用。
session.trans_sid_hosts $_SERVER['HTTP_HOST'] INI_ALL 自 PHP 7.1.0 起可用。
session.sid_length "32" INI_ALL 自 PHP 7.1.0 起可用。
session.sid_bits_per_character "4" INI_ALL 自 PHP 7.1.0 起可用。
session.upload_progress.enabled "1" INI_PERDIR  
session.upload_progress.cleanup "1" INI_PERDIR  
session.upload_progress.prefix "upload_progress_" INI_PERDIR  
session.upload_progress.name "PHP_SESSION_UPLOAD_PROGRESS" INI_PERDIR  
session.upload_progress.freq "1%" INI_PERDIR  
session.upload_progress.min_freq "1" INI_PERDIR  
session.lazy_write "1" INI_ALL  
session.hash_function "0" INI_ALL 自 PHP 7.1.0 起移除。
session.hash_bits_per_character "4" INI_ALL 自 PHP 7.1.0 起移除。
session.entropy_file "" INI_ALL 自 PHP 7.1.0 起移除。
session.entropy_length "0" INI_ALL 自 PHP 7.1.0 起移除
有关 INI_* 模式的更多详细信息和定义,请参阅 配置设置的位置

会话管理系统支持许多配置选项,您可以将这些选项放在 php.ini 文件中。我们将简要概述。

session.save_handler string
session.save_handler 定义用于存储和检索与会话关联的数据的处理程序的名称。默认为 files。请注意,各个扩展可能会注册它们自己的 save_handler;注册的处理程序可以在每个安装的基础上获得,方法是参考 phpinfo()。另请参阅 session_set_save_handler()
session.save_path string
session.save_path 定义传递给保存处理程序的参数。如果您选择默认的文件处理程序,那么这就是创建文件的路径。另请参阅 session_save_path()

此指令有一个可选的 N 参数,它确定会话文件将被散布在其中的目录级别数。例如,设置为 '5;/tmp' 最终可能会创建一个会话文件和位置,如 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If 。为了使用 N,您必须在使用之前创建所有这些目录。一个小的 shell 脚本位于 ext/session 中,用于执行此操作,它被称为 mod_files.sh,它的 Windows 版本称为 mod_files.bat。还要注意,如果使用 N 且大于 0,则不会执行自动垃圾回收,请参阅 php.ini 的副本以获取更多信息。此外,如果您使用 N,请确保将 session.save_path 括在“引号”中,因为分隔符 (;) 也用于 php.ini 中的注释。

文件存储模块默认使用模式 600 创建文件。可以使用可选的 MODE 参数更改此默认值:N;MODE;/path,其中 MODE 是模式的八进制表示形式。设置 MODE 不会影响进程 umask。

警告

如果将其设置为一个世界可读目录,例如 /tmp(默认值),则服务器上的其他用户可能会通过获取该目录中文件的列表来劫持会话。

注意

当使用可选的目录级别参数 N 时,如上所述,请注意,由于需要大量的目录,使用大于 1 或 2 的值不适合大多数网站:例如,值为 3 意味着 (2 ** session.sid_bits_per_character) ** 3 目录存在于文件系统中,这会导致浪费大量空间和 inode。

仅当您绝对确定您的网站足够大以至于需要它时,才使用大于 2 的 N

session.name string
session.name 指定会话的名称,该名称用作 Cookie 名称。它应该只包含字母数字字符。默认为 PHPSESSID。另请参阅 session_name()
session.auto_start bool
session.auto_start 指定会话模块是否在请求启动时自动启动会话。默认为 0(禁用)。
session.serialize_handler string
session.serialize_handler 定义用于序列化/反序列化数据的处理程序的名称。支持 PHP 序列化格式(名称 php_serialize)、PHP 内部格式(名称 phpphp_binary)和 WDDX(名称 wddx)。WDDX 仅在使用 WDDX 支持 编译 PHP 时可用。 php_serialize 在内部使用纯序列化/反序列化函数,并且没有 phpphp_binary 拥有的限制。旧的序列化处理程序无法在 $_SESSION 中存储数字索引,也不能存储包含特殊字符 (|!) 的字符串索引。使用 php_serialize 避免脚本关闭时出现数字索引或特殊字符错误。默认为 php
session.gc_probability int
session.gc_probabilitysession.gc_divisor 结合使用,用于管理启动 gc(垃圾回收)例程的概率。默认为 1。有关详细信息,请参阅 session.gc_divisor
session.gc_divisor int
session.gc_divisorsession.gc_probability 结合定义每次会话初始化时启动 gc(垃圾回收)过程的概率。概率是通过使用 gc_probability/gc_divisor 计算的,例如 1/100 表示每次请求启动 GC 过程的概率为 1%。session.gc_divisor 默认为 100
session.gc_maxlifetime int
session.gc_maxlifetime 指定数据将被视为“垃圾”并可能被清理的秒数。垃圾回收可能会在会话启动期间发生(取决于 session.gc_probabilitysession.gc_divisor)。默认为 1440(24 分钟)。

注意: 如果不同的脚本具有不同的 session.gc_maxlifetime 值,但共享相同的位置来存储会话数据,那么具有最小值的脚本将清理数据。在这种情况下,将此指令与 session.save_path 结合使用。

session.referer_check string
session.referer_check 包含您要检查每个 HTTP Referer 的子字符串。如果 Referer 由客户端发送,并且未找到子字符串,则嵌入的会话 ID 将被标记为无效。默认为空字符串。
session.entropy_file string
session.entropy_file 给出了一个外部资源(文件)的路径,该资源将在会话 ID 创建过程中用作额外的熵源。示例是 /dev/random/dev/urandom,它们在许多 Unix 系统上可用。 此功能在 Windows 上受支持。将 session.entropy_length 设置为非零值将使 PHP 使用 Windows 随机 API 作为熵源。

注意: 在 PHP 7.1.0 中移除。 session.entropy_file 默认为 /dev/urandom/dev/arandom(如果可用)。

session.entropy_length int
session.entropy_length 指定从上述文件中读取的字节数。默认为 32 在 PHP 7.1.0 中移除。
session.use_strict_mode bool
session.use_strict_mode 指定模块是否使用严格的会话 ID 模式。如果启用此模式,模块将不接受未初始化的会话 ID。如果浏览器发送了未初始化的会话 ID,则会向浏览器发送新的会话 ID。通过严格模式,应用程序可以免受会话劫持攻击。默认值为 0(禁用)。

注意: 启用 session.use_strict_mode 是确保一般会话安全所必需的。建议所有网站都启用此选项。有关更多详细信息,请参见 session_create_id() 示例代码。

警告

如果通过 session_set_save_handler() 注册的自定义会话处理程序未实现 SessionUpdateTimestampHandlerInterface::validateId() 或未提供 validate_sid 回调函数,则无论此指令的值如何,严格的会话 ID 模式实际上都已禁用。特别是请注意,SessionHandler 实现 SessionHandler::validateId()

session.use_cookies bool
session.use_cookies 指定模块是否使用 cookie 在客户端存储会话 ID。默认值为 1(启用)。
session.use_only_cookies bool
session.use_only_cookies 指定模块是否 **仅** 使用 cookie 在客户端存储会话 ID。启用此设置可以防止通过 URL 传递会话 ID 的攻击。默认值为 1(启用)。
session.cookie_lifetime int
session.cookie_lifetime 指定发送到浏览器的 cookie 的生存期(以秒为单位)。值 0 表示“直到浏览器关闭”。默认值为 0。另请参见 session_get_cookie_params()session_set_cookie_params()

注意: 过期时间戳相对于服务器时间设置,服务器时间不一定与客户端浏览器的当前时间相同。

session.cookie_path string
session.cookie_path 指定在会话 cookie 中设置的路径。默认值为 /。另请参见 session_get_cookie_params()session_set_cookie_params()
session.cookie_domain string
session.cookie_domain 指定在会话 cookie 中设置的域。默认情况下,此值为空,表示根据 cookie 规范,将使用生成 cookie 的服务器的主机名。另请参见 session_get_cookie_params()session_set_cookie_params()
session.cookie_secure bool
session.cookie_secure 指定 cookie 是否应仅通过安全连接发送。如果将此选项设置为 on,则会话仅在 HTTPS 连接中有效。如果设置为 off,则会话在 HTTP 和 HTTPS 连接中都有效。默认值为 off。另请参见 session_get_cookie_params()session_set_cookie_params()
session.cookie_httponly bool
将 cookie 标记为仅通过 HTTP 协议访问。这意味着 cookie 无法通过脚本语言(例如 JavaScript)访问。此设置可以有效地帮助减少通过 XSS 攻击造成的身份盗窃(尽管并非所有浏览器都支持此设置)。
session.cookie_samesite string
允许服务器断言 cookie 不应与跨站点请求一起发送。此断言允许用户代理减轻跨源信息泄露的风险,并提供一定程度的针对跨站点请求伪造攻击的保护。请注意,并非所有浏览器都支持此功能。空值表示不会设置任何 SameSite cookie 属性。 LaxStrict 表示 cookie 不会在 POST 请求中跨域发送;Lax 会在跨域 GET 请求中发送 cookie,而 Strict 则不会。
session.cache_limiter string
session.cache_limiter 指定用于会话页面的缓存控制方法。它可以是以下值之一:nocacheprivateprivate_no_expirepublic。默认值为 nocache。有关这些值的含义的信息,请参见 session_cache_limiter() 文档。
session.cache_expire int
session.cache_expire 指定缓存会话页面的生存时间(以分钟为单位),这对 nocache 限制器无效。默认值为 180。另请参见 session_cache_expire()
session.use_trans_sid bool
session.use_trans_sid 指定是否启用透明 SID 支持。默认值为 0(禁用)。

注意: 与基于 cookie 的会话管理相比,基于 URL 的会话管理存在额外的安全风险。例如,用户可以通过电子邮件将其朋友发送包含活动会话 ID 的 URL,或者用户可以将其保存到书签中,并始终使用相同的会话 ID 访问您的网站。 自 PHP 7.1.0 起,trans sid 功能处理完整的 URL 路径,例如 https://php.net/。以前的 PHP 版本仅处理相对 URL 路径。重写目标主机由 session.trans_sid_hosts 定义。

session.trans_sid_tags string
session.trans_sid_tags 指定在启用透明 SID 支持时哪些 HTML 标签将被重写以包含会话 ID。默认值为 a=href,area=href,frame=src,input=src,form= form 是特殊的标签。 <input hidden="session_id" name="session_name"> 将作为表单变量添加。

注意: 在 PHP 7.1.0 之前,url_rewriter.tags 用于此目的。自 PHP 7.1.0 起,fieldset 不再被视为特殊标签。

session.trans_sid_hosts string
session.trans_sid_hosts 指定在启用透明 SID 支持时哪些主机将被重写以包含会话 ID。默认值为 $_SERVER['HTTP_HOST']。可以使用“,” 指定多个主机,主机之间不允许使用空格。例如,php.net,wiki.php.net,bugs.php.net
session.sid_length int
session.sid_length 允许您指定会话 ID 字符串的长度。会话 ID 长度可以在 22 到 256 之间。 默认值为 32。如果您需要兼容性,可以指定 32、40 等。更长的会话 ID 更难猜测。建议至少使用 32 个字符。
提示

兼容性说明:使用 32 代替 session.hash_function=0 (MD5) 和 session.hash_bits_per_character=4,session.hash_function=1 (SHA1) 和 session.hash_bits_per_character=6。使用 26 代替 session.hash_function=0 (MD5) 和 session.hash_bits_per_character=5。使用 22 代替 session.hash_function=0 (MD5) 和 session.hash_bits_per_character=6。您必须配置 INI 值以确保会话 ID 中至少有 128 位。不要忘记为 session.sid_bits_per_character 设置适当的值,否则您的会话 ID 将变得更弱。

注意: 此设置是在 PHP 7.1.0 中引入的。

session.sid_bits_per_character int
session.sid_bits_per_character 允许您指定编码会话 ID 字符中的位数。可能的值是“4”(0-9、a-f)、“5”(0-9、a-v)和“6”(0-9、a-z、A-Z、“-”、“,”)。 默认值为 4。更多的位数会导致更强的会话 ID。5 是大多数环境的推荐值。

注意: 此设置是在 PHP 7.1.0 中引入的。

session.hash_function mixed
session.hash_function 允许您指定用于生成会话 ID 的哈希算法。“0”表示 MD5(128 位),“1”表示 SHA-1(160 位)。

您也可以指定 哈希扩展(如果可用)提供的任何算法,例如 sha512whirlpool。可以使用 hash_algos() 函数获取支持算法的完整列表。

注意: 已在 PHP 7.1.0 中移除。

session.hash_bits_per_character int
session.hash_bits_per_character 允许您定义将二进制哈希数据转换为可读数据时每个字符中存储的位数。可能的值是“4”(0-9、a-f)、“5”(0-9、a-v)和“6”(0-9、a-z、A-Z、“-”、“,”)。

注意: 已在 PHP 7.1.0 中移除。

session.upload_progress.enabled bool
启用上传进度跟踪,填充 $_SESSION 变量。默认值为 1,启用。
session.upload_progress.cleanup bool
一旦所有 POST 数据都被读取(即上传完成),就清理进度信息。默认值为 1,启用。

注意: 强烈建议保持此功能启用。

session.upload_progress.prefix string
$_SESSION 中,用于上传进度键的前缀。此键将与 $_POST[ini_get("session.upload_progress.name")] 的值连接,以提供唯一的索引。 默认值为 "upload_progress_"。
session.upload_progress.name string
用于存储进度信息的 $_SESSION 中的键名。另请参见 session.upload_progress.prefix 如果未传递或不可用 $_POST[ini_get("session.upload_progress.name")],则不会记录上传进度。 默认值为 "PHP_SESSION_UPLOAD_PROGRESS"。
session.upload_progress.freq mixed
定义应多久更新一次上传进度信息。这可以以字节为单位定义(例如,“每 100 字节更新一次进度信息”),也可以以百分比定义(例如,“接收整个文件大小的 1% 后更新一次进度信息”)。 默认值为 "1%"。
session.upload_progress.min_freq int
更新之间的最小延迟(以秒为单位)。默认值为“1”(一秒)。
session.lazy_write bool
session.lazy_write 设置为 1 时,表示只有在会话数据更改时才会重新写入会话数据。默认值为 1,已启用。

除非 session.upload_progress.enabled 已启用并且 $_POST[ini_get("session.upload_progress.name")] 变量已设置,否则不会注册上传进度。有关此功能的更多详细信息,请参见 会话上传进度

添加注释

用户贡献的注释 24 个注释

Walerian Walawski - https://w87.eu/
10 个月前
找不到 mod_files.sh?这里有
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬

#!/usr/bin/env bash

if [[ "$2" = "" ]] || [[ "$3" = "" ]]; then
echo "Usage: $0 BASE_DIRECTORY DEPTH BITS_PER_CHAR"
echo "BASE_DIRECTORY 将在不存在时创建"
echo "DEPTH 必须是大于 0 的整数"
echo "BITS_PER_CHAR(session.sid_bits_per_character) 应该是 4、5 或 6 之一"
# https://php.net/manual/en/session.configuration.php#ini.session.sid-bits-per-character
exit 1
fi

if [[ "$2" = "0" ]] && [[ ! "$4" = "recurse" ]]; then
echo "无法创建深度为 0 的目录树,退出"
fi

if [[ "$2" = "0" ]]; then
exit 0
fi

directory="$1"
depth="$2"
bitsperchar="$3"

hash_chars="0 1 2 3 4 5 6 7 8 9 a b c d e f"

if [[ "$bitsperchar" -ge "5" ]]; then
hash_chars="$hash_chars g h i j k l m n o p q r s t u v"
fi

if [[ "$bitsperchar" -ge "6" ]]; then
hash_chars="$hash_chars w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - ,"
fi

while [[ -d $directory ]] && [[ $( ls $directory ) ]]; do
echo "目录 $directory 不为空!您想做什么?"

options="\"删除目录内容\" \"选择另一个目录\" \"退出\""
eval set $options
select opt in "$@"; do

if [[ $opt = "删除目录内容" ]]; then
echo "删除 $directory 内容... "
rm -rf $directory/*
elif [[ $opt = "选择另一个目录" ]]; then
echo "您想选择哪个目录?"
read directory
elif [[ $opt = "退出" ]]; then
exit 0
fi

break;
done
done

if [[ ! -d $directory ]]; then
mkdir -p $directory
fi

echo "在 $directory 中创建会话路径,深度为 $depth,用于 session.sid_bits_per_character = $bitsperchar"

for i in $hash_chars; do
newpath="$directory/$i"
mkdir $newpath || exit 1
bash $0 $newpath `expr $depth - 1` $bitsperchar recurse
done
Christopher Kramer
9 年前
在 debian(基于)系统上,在运行时更改 session.gc_maxlifetime 实际上没有效果。Debian 通过设置 session.gc_probability=0 来禁用 PHP 自己的垃圾收集器。相反,它有一个每 30 分钟运行一次的 cron 作业(参见 /etc/cron.d/php5),它会清理旧会话。此 cron 作业基本上会查看您的 php.ini 并使用其中的 session.gc_maxlifetime 值来决定要清理哪些会话(参见 /usr/lib/php5/maxlifetime)。

您可以调整 php.ini 中的全局值(通常是 /etc/php5/apache2/php.ini)。或者您可以更改 session.save_path,这样 debian 的 cron 作业就不会再清理您的会话了。然后您需要使用您自己的 cron 作业进行自己的垃圾收集,或者启用 PHP 的垃圾收集(然后 PHP 需要对 save_path 拥有足够的权限)。

为什么 Debian 不使用 PHP 的垃圾收集?
出于安全原因,他们将会话数据存储在权限非常严格的地方(/var/lib/php5)。使用粘性位设置,只有 root 才能在其中重命名或删除文件,因此 PHP 本身无法清理旧的会话数据。参见 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=267720
zch1
7 个月前
当 pwd 包含特殊字符时,应该对其进行 urlencode。
例如

save_handler:redis
save_path: tcp://127.0.0.1:6739?auth=urlencode('xxxxx')
GreenReaper
9 年前
我们发现 session.save_path 深度为 3 会导致 inode 的过度浪费,实际上还会浪费存储目录树的磁盘空间。ext2/3/4 上的 dir_indexes 选项使得更大的目录更加可行,因此我们决定改为深度为 2。

弄清楚如何将现有的 PHP 会话向上移动一个目录树需要花一些时间,但我们最终在根会话目录中运行了以下代码

#!/bin/sh
for a in ./* ; do
cd ./$a
pwd
for b in ./* ; do
cd ./$b
pwd
# 将现有会话移出
find ./* -xdev -type f -print0 | xargs -0 mv -t .
# 删除子目录
find ./* -xdev -type d -print0 | xargs -0 rmdir
cd ..
done
cd ..
done

此脚本可能不是最好的方法,但它可以快速完成工作。您可以通过添加或删除“for”循环来修改它以适应不同的深度。

文档中给出了深度为 5 的示例,但五是绝对不行的。如果您要超过 2,则可能需要考虑使用大型 memcached 或 redis 实例。
info at thimbleopensource dot com
9 年前
我发现如果需要设置自定义会话设置,只需要在会话开始时设置一次。然后会话会保持其设置,即使您使用 ini_set 并更改它们,原始会话仍然会使用其原始设置,直到它过期。

只是觉得这对某些人可能有用。
Wouter
14 年前
在 .htaccess 中设置 session.cookie_lifetime 指令时,请使用字符串格式,例如:

php_value session.cookie_lifetime "123456"

而不是

php_value session.cookie_lifetime 123456

在我的情况下,使用上面提到的整数不起作用(Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.5 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g)
jlevene at etisoftware dot com
11 年前
由于无法找到 mod_files.sh 的实际副本,并且看到了很多关于它的投诉/错误修复请求,这里有一个有效的副本。它从 PHP.INI 获取所有参数,因此您没有机会搞砸

#!/bin/bash
#
# 创建 PHP 会话存储的目录。
# 替换“随附”PHP 的那个,它(a)并不总是随附,
# 而且(b)效果不太好。
#
# 此版本不接受任何参数,并使用 PHP.INI 中的值(如果它
# 能够找到它)。
#
# 在 OS-X 和 CentOS(以及可能所有其他)Linux 中工作。
#
# 2013 年 2 月,作者 Jeff Levene。

[[ $# -gt 0 ]] && echo "$0 不需要任何命令行参数。
它会根据 PHP.INI 文件中的调用执行任何操作(如果它能找到它)。
" && exit 1

# 尽可能找到 PHP.INI 文件
phpIni=/usr/local/lib/php.ini # 默认的 PHP.INI 位置
[[ ! -f "$phpIni" ]] && phpIni=/etc/php.ini # 次要位置
[[ ! -f "$phpIni" ]] && phpIni= # 找到了吗?

# 从 PHP.INI 文件输出给定(作为 $1)参数
# “空”括号中包含空格和制表符。
#
PhpConfigParam() {
[[ ! "$phpIni" ]] && return
# 从 INI 文件获取行
varLine=`grep "^[ ]*$1[ ]*=" "$phpIni"`

# 提取值
value=`expr "$varLine" : ".*$1[ ]*=[ ]*['\"]*\([^'\"]*\)"`
echo "$value"
}

if [[ "$phpIni" ]]
then
savePath=`PhpConfigParam session.save_path`
# 如果前面有数字和分号,则将其删除
dirDepth=`expr "$savePath" : '\([0-9]*\)'`
[[ "$dirDepth" ]] && savePath=`expr "$savePath" : '[0-9]*;\(.*\)'` || dirDepth=0
bits=`PhpConfigParam session.hash_bits_per_character`
case "x$bits" in
x) echo "hash_bits_per_character 未定义。不运行。" ; exit 2 ;;
x4) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f' ;;
x5) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v' ;;
x6) alphabet='0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v'
alphabet="$alphabet w x y z A B C D E F G H I J K L M N O P Q R S T U V W"
alphabet="$alphabet X Y Z - ,"
;;
*) echo "无法识别的 hash_bits_per_character。不运行。" ; exit 2 ;;
esac
else
echo "找不到 PHP.INI 文件。不运行。抱歉。"
exit 2
fi

# 要创建的目录深度为 $1。0 表示只创建命名
# 目录。要开始的目录是 $2。
#
# 递归使用,因此变量必须是“本地”的。

doDir() {
local dir="$2"
if [[ -d "$dir" ]]
then
echo "目录 '$dir' 已存在。没问题。"
elif [[ -f "$dir" ]]
then
echo "文件 '$dir' 存在。终止程序。" ; exit 2
else
if mkdir "$dir"
then
echo "目录 '$dir' 已创建。"
else
echo "无法创建目录 '$dir'。终止程序。" ; exit 2
fi
fi
chmod a+rwx "$dir"
if [[ $1 -gt 0 ]]
then
local depth=$(( $1 - 1 ))
for letter in $alphabet
do doDir $depth "$dir/$letter"
done
fi
}


echo "正在使用 savePath='$savePath',dirDepth=$dirDepth,以及 bitsPerCharacter=$bits。"
sleep 3

doDir $dirDepth "$savePath"

exit 0
hassankhodadadeh at NOSPAM dot gmail dot com
12 年前
"session.gc_maxlifetime" 的最大值为 65535。大于此值的设置可能会导致 PHP 会话停止工作。
boan dot web at outlook dot com
5 年前
session.cache_limiter 可以为空字符串,以完全禁用缓存头。

引用
> 将缓存限制器设置为 '' 将完全关闭自动发送缓存头的功能。

https://php.net/manual/en/function.session-cache-limiter.php
li-lingjie
6 年前
使用 SessionHandlerInterface 接口自定义 Redis 会话,发现以下问题

使用 ini_set ('session.save_path', "tcp: //127.0.0.1: 6379? Auth = password"); 会报错

PHP Fatal error: session_start (): Failed to initialize storage module: user (path: tcp: //127.0.0.1: 6379? Auth = password);

使用 session_save_path ("tcp: //127.0.0.1: 6379? Auth = password") 不会
theking2(at)king.ma
5 个月前
将 'sid_bits_per_character' 设置为 6 时,请注意 'sid_length' 的设置。

将 sid_bits_per_character 设置为 6 会将字符 "," 添加到可能的字符列表中。逗号将被转义并以 "%2C" 的形式传输(在 Chromium 版本 119.0.6045.199 上测试),为每个逗号在 SESSION_ID 中添加两个额外的字符。
theking2(at)king.ma
5 个月前
为了防止中间人攻击,您需要确保会话 cookie 仅通过安全通道传输,在它前面添加魔法字符串 "__Secure-"。[1]

例如
<?php
session_start
( [ 'name' => '__Secure-Session-ID' ] );
?>

该 cookie 在非安全通道上将不可用。

(将此注释放在这里,由于噪音太多,可能会被忽略。)

[1]: https://mdn.org.cn/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
Nicholas
13 年前
在 5.3.3 中,瞬态会话似乎不起作用。

例如

<?php
ini_set
("session.use_cookies", 0);
ini_set("session.use_trans_sid", 1);
session_start();

if (isset(
$_SESSION["foo"])) {
echo
"Foo: " . $_SESSION["foo"];
} else {
$_SESSION["foo"] = "Bar";
echo
"<a href=?" . session_name() . "=" . session_id() . ">Begin test</a>";
}
?>

这在 5.2.5 中有效,但在 5.3.3 中无效。
ohcc at 163 dot com
6 年前
当虚拟主机共享同一个会话保存目录时,您应该更加注意配置 session.gc_maxlifetime。一个主机的会话数据可能会在另一个主机运行 PHP 时被 GC 清理。
AskApache
13 年前
这是我设置 session.save_path 的方式
session.save_path = "1;/home/askapache/tmp/s"
因此,如果您想使用 777 权限创建,可以使用此兼容的 shell 脚本,将 umask 更改为 0000;
sh -o braceexpand -c "umask 0077;mkdir -p s/{0..9}/{a..z} s/{a..z}/{0..9}"

然后,您可以通过将以下内容添加到您的 crontab 来创建清理会话文件夹的 cron 作业,该作业会删除任何超过一小时的会话文件
@daily find /home/askapache/tmp/s -type f -mmin +60 -exec rm -f {} \; &>/dev/null

这将在以下目录中创建会话
/home/askapache/tmp/s/b/sess_b1aba5q6io4lv01bpc6t52h0ift227j6

我认为任何非大型网站都不需要超过 1 级深度。否则,您会创建太多目录,从而降低此方法带来的性能提升。
00 at f00n dot com
16 年前
在经历了许多与垃圾回收无法清理我的会话有关的问题后,我通过以下方法解决了这些问题。

首先,我在 php.ini 中发现了这一点(由于我使用 phpinfo(); 来查看我的托管 ini,因此没有注意到这一点)。

; 注意:如果您使用子目录选项来存储会话文件
; (请参阅上面的 session.save_path),那么垃圾回收 *不会*
; 自动进行。您需要通过 shell 脚本、cron 条目或其他方法执行自己的垃圾

; 收集。; 例如,以下脚本等效于
; 将 session.gc_maxlifetime 设置为 1440(1440 秒 = 24 分钟)
; cd /path/to/sessions; find -cmin +24 | xargs rm

考虑到这一点,有一些选择。

1. 不要使用自定义 save_path。
** 这意味着如果您的 ISP 没有将您的会话临时目录默认设置为比安装默认目录更安全的地方,或者您正在使用共享目录来保存会话数据,那么您最好使用命名会话以防止您的会话在其他人的脚本中可见。为此创建一个唯一的 ID 名称是常见的做法。**

2. 使用自定义文件夹,但编写垃圾回收脚本。

3. 使用自定义处理程序和数据库
mikaelkael at php dot net
15 年前
最近,我需要在我的 Windows 程序下更改会话 save_path。使用 ini_set('session.save_path', '../data/sessions');(以及 session.gc_divisor = 1 用于测试),我总是会得到 'Error #8 session_start(): ps_files_cleanup_dir: opendir(../data/sessions) failed: Result too large'。

我通过使用 ini_set('session.save_path', realpath('../data/sessions')); 修正了这个问题。
orbill
13 年前
显然,session.use_only_cookies 的默认值在 5.3.3 中从 0 更改为 1。如果您没有在您的 php.ini 或代码中将其设置为 0,那么透明会话将无法正常工作。
white-gandalf at web dot de
6 年前
session.use_strict_mode 对增强您的安全性帮助很小:它只减轻了一种非常具体的攻击变体(攻击者向受害者提供一个“空” sid 以便稍后将自己的浏览器适配到该会话) - 相比之下,例如,攻击者预先打开一个会话,并将该会话的 sid 传递给受害者,以便受害者被适配到预先打开的会话。在后一种情况下,此标志没有任何帮助。在其他情况下,当会话 ID 被泄露时,此标志没有任何帮助。在其他所有情况下,此标志没有任何帮助。

但此标志会使 php 函数 session_id() 在其参数化变体中变得无用,从而阻止任何建立在该函数之上的 php 功能。
descartavel1+php at gmail dot com
1 年前
您应该将 `session.name` 设置为使用前缀 `__Host-` 或 `__Secure-`。请参阅 https://mdn.org.cn/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
sony-santos at bol dot com dot br
15 年前
作为对 00 at f00n 的回复,此页面解释了

"(...) 如果使用 N 并且大于 0,那么不会执行自动垃圾回收 (...)"

因此,您可以实际使用自定义 save_path,并启用自动垃圾回收,因为您没有使用子目录选项(即 N 个子目录级别)。
polygon dot co dot in at gmail dot com
2 年前
在 php.ini 中,session.save_handler 定义了用于存储和检索与会话关联数据的处理程序的名称。[默认值为 files。]

默认情况下,session.save_handler 支持以下选项

session.save_handler = files
session.save_handler = sqlite
session.save_handler = redis
session.save_handler = memcached

这些选项默认情况下会为使用会话的任何 HTTP 请求锁定会话。
锁定意味着,用户无法访问与会话相关的页面,直到当前请求完成。

因此,如果您认为切换到这些选项会提高性能;答案是否定的!因为锁定行为的存在。

要克服/自定义会话锁定行为,请使用以下方法。

session.save_handler = user
这对所有会话存储模式(包括以上列表)都适用。

对于 "user" 类型的 save_handler,我们可以忽略锁定以提高性能(如函数 session_set_save_handler 中所述)。但为了做到这一点,我们需要注意仅将会话用于身份验证,而不是用于在脚本之间传递数据。

要跨脚本传递数据,请使用 GET 方法来实现目标。
phpforcharity dot 5 dot pistos at geoshell dot com
16 年前
要使会话 ID 显示在 URI 中,而不是通过 cookie 存储,您不仅要将 session.use_cookies 设置为 0,还要将 session.use_trans_sid 设置为 1。否则,会话 ID 既不会在 cookie 中,也不会在 URI 中!
Anonymous
7 年前
作为对以下评论的回复:https://php.net/manual/en/session.configuration.php#107990,其中声称 gc_maxlifetime 值大于 65535 会破坏会话系统。我无法重现这种情况。

我已经将 gc_maxlifetime 设置为 31536000(1 年),会话系统运行良好。我还没有尝试过会话现在能持续多长时间(我正在测试这个过程),但它肯定不会破坏 PHP 会话。
To Top