PHP Conference Japan 2024

运行时配置

这些函数的行为受 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 开始可用。从 PHP 8.4.0 开始弃用。
session.sid_bits_per_character "4" INI_ALL 从 PHP 7.1.0 开始可用。从 PHP 8.4.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 字符串
session.save_handler 定义用于存储和检索与会话关联的数据的处理程序的名称。默认为 files。请注意,各个扩展可以注册自己的 save_handler;注册的处理程序可以通过参考 phpinfo() 在每个安装的基础上获取。另请参阅 session_set_save_handler()
session.save_path 字符串
session.save_path 定义传递给保存处理程序的参数。如果您选择默认的文件处理程序,则这是创建文件的路径。另请参阅 session_save_path()

此指令有一个可选的 N 参数,该参数确定您的会话文件将在其中分布的目录级别数。例如,设置为 '5;/tmp' 最终可能会创建一个会话文件和位置,例如 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If 。为了使用 N,您必须在使用前创建所有这些目录。在 ext/session 中存在一个小的 shell 脚本可以执行此操作,它称为 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 字符串
session.name 指定用作 cookie 名称的会话的名称。它只应包含字母数字字符。默认为 PHPSESSID。另请参阅 session_name()
session.auto_start 布尔值
session.auto_start 指定会话模块是否在请求启动时自动启动会话。默认为 0(禁用)。
session.serialize_handler 字符串
session.serialize_handler 定义用于序列化/反序列化数据的处理程序的名称。PHP 序列化格式(名称 php_serialize)、PHP 内部格式(名称 phpphp_binary)和 WDDX 受支持(名称 wddx)。仅当 PHP 使用 WDDX 支持 编译时,WDDX 才可用。php_serialize 在内部使用简单的序列化/反序列化函数,并且没有 phpphp_binary 拥有的限制。旧的序列化处理程序无法存储数字索引,也无法存储字符串索引包含特殊字符 (|!) 在 $_SESSION 中。使用 php_serialize 避免脚本关闭时出现数字索引或特殊字符错误。默认为 php
session.gc_probability 整数
session.gc_probabilitysession.gc_divisor 结合使用来管理启动 gc(垃圾回收)例程的概率。默认为 1。必须大于或等于 0。有关详细信息,请参阅 session.gc_divisor
session.gc_divisor 整数
session.gc_divisorsession.gc_probability 共同决定了每次会话初始化时垃圾回收 (gc) 进程启动的概率。概率通过 gc_probability/gc_divisor 计算得出,例如 1/100 表示每次请求有 1% 的概率启动 GC 进程。 session.gc_divisor 默认为 100。必须大于 0
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 的 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 字符串
session.trans_sid_hosts 指定在启用透明 sid 支持时,哪些主机需要重写以包含会话 ID。默认为 $_SERVER['HTTP_HOST']。可以使用 "," 指定多个主机,主机之间不允许有空格。例如:php.net,wiki.php.net,bugs.php.net
session.sid_length 整数
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 整数
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 混合类型
session.hash_function 允许您指定用于生成会话 ID 的哈希算法。“0”表示 MD5(128 位),“1”表示 SHA-1(160 位)。

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

注意: 已在 PHP 7.1.0 中移除。

session.hash_bits_per_character 整数
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 布尔值
启用上传进度跟踪,填充 $_SESSION 变量。默认为 1,启用。
session.upload_progress.cleanup 布尔值
在读取所有 POST 数据(即上传完成)后立即清理进度信息。默认为 1,启用。

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

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

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

添加注释

用户贡献的注释 21 条注释

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

#!/usr/bin/env bash

if [[ "$2" = "" ]] || [[ "$3" = "" ]]; then
echo "用法:$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
10 年前
在 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

11个月前
如果密码包含特殊字符,则应进行URL编码。
例如

save_handler:redis
save_path: tcp://127.0.0.1:6739?auth=urlencode('xxxxx')
GreenReaper
10 年前
我们发现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致命错误:session_start(): 无法初始化存储模块: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
9个月前
将'sid_bits_per_character'设置为六时,请注意'sid_length'。

将sid_bits_per_character设置为6会将字符“,”包含到可能的字符列表中。逗号将被转义并传输为“%2C”(在Chromium版本119.0.6045.199上测试),为每个逗号在SESSION_ID中添加两个额外的字符。
theking2(at)king.ma
9个月前
为了防止中间人攻击,您需要确保会话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
14年前
瞬态会话似乎在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
7年前
当虚拟主机共享相同的会话保存目录时,您应该更加小心地配置session.gc_maxlifetime。当另一个主机运行php时,一个主机的会话数据可能会被gc删除。
AskApache
14年前
这是我设置session.save_path的方式
session.save_path = "1;/home/askapache/tmp/s"
因此,如果要使用777权限创建文件夹结构,可以使用此兼容的shell脚本;如果要使用777权限创建,请将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. 使用自定义处理程序和数据库
[email protected]
15 年前
最近,我需要在我的 Windows 程序中更改 session save_path。使用 ini_set('session.save_path', '../data/sessions');(以及 session.gc_divisor = 1 用于测试),我总是得到“错误 #8 session_start(): ps_files_cleanup_dir: opendir(../data/sessions) failed: Result too large”。

我通过使用 ini_set('session.save_path', realpath('../data/sessions')); 进行更改来解决此问题。
orbill
14年前
显然,session.use_only_cookies 的默认值在 5.3.3 中已从 0 更改为 1。如果您尚未在 php.ini 或代码中将其设置为 0,则透明会话将无法工作。
[email protected]
6年前
session.use_strict_mode 对增强您的安全性几乎没有作用:此标志仅缓解了一种非常具体的攻击变体(攻击者向受害者提供“空”sid 以便稍后将其浏览器适配到该会话)——相比之下,例如攻击者预先打开一个会话,并将该会话的 sid 提供给受害者,从而使受害者适配到预先打开的会话。在后一种情况下,此标志无济于事。在其他任何其他漏洞导致会话 ID 泄漏的场景中,此标志都无济于事。

但是此标志使 php 函数 session_id() 在其参数化变体中变得无用,从而阻止了任何基于此函数构建的 php 功能。
[email protected]
1 年前
您应该将 `session.name` 设置为使用前缀 `__Host-` 或 `__Secure-`。请参阅 https://mdn.org.cn/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes
[email protected]
3 年前
在 php.ini 中,session.save_handler 定义了用于存储和检索与会话关联的数据的处理程序的名称。[默认为文件。]

默认情况下,session.save_handler 支持以下内容

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

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

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

要克服/自定义会话锁定行为,请按如下所示使用。

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

对于“用户”类型的 save_handler,我们可以忽略锁以获得更好的性能(如函数 session_set_save_handler 中所述)。但是,为此,我们需要注意仅将会话用于身份验证,而不是用于在脚本之间传递数据。

要跨脚本传递数据,请使用 GET 方法来实现目标。
To Top