运行时配置
这些函数的行为受 php.ini 的影响。
表 1. 会话配置选项
名称 默认值 可修改范围 更新纪录
session.save_path "" php_ini_all
session.name "phpsessid" php_ini_all
session.save_handler "files" php_ini_all
session.auto_start "0" php_ini_all
session.gc_probability "1" php_ini_all
session.gc_divisor "100" php_ini_all 自 php 4.3.2 起可用。
session.gc_maxlifetime "1440" php_ini_all
session.serialize_handler "php" php_ini_all
session.cookie_lifetime "0" php_ini_all
session.cookie_path "/" php_ini_all
session.cookie_domain "" php_ini_all
session.cookie_secure "" php_ini_all 自 php 4.0.4 起可用。
session.use_cookies "1" php_ini_all
session.use_only_cookies "1" php_ini_all 自 php 4.3.0 起可用。
session.referer_check "" php_ini_all
session.entropy_file "" php_ini_all
session.entropy_length "0" php_ini_all
session.cache_limiter "nocache" php_ini_all
session.cache_expire "180" php_ini_all
session.use_trans_sid "0" php_ini_all 在 php <= 4.2.3 是 php_ini_all,在 php < 5 是 php_ini_perdir。自 php 4.0.3 起可用。
session.bug_compat_42 "1" php_ini_all 自 php 4.3.0 起可用。
session.bug_compat_warn "1" php_ini_all 自 php 4.3.0 起可用。
session.hash_function "0" php_ini_all 自 php 5.0.0 起可用。
session.hash_bits_per_character "4" php_ini_all 自 php 5.0.0 起可用。
url_rewriter.tags "a=href,area=href,frame=src,form=,fieldset=" php_ini_all 自 php 4.0.4 起可用。
有关 php_ini_* 常量进一步的细节与定义参见附录 i。
会话管理系统支持许多配置选项,可以在自己的 php.ini 文件中设定。这里只是个简短的概览。
session.save_handler string
session.save_handler 定义了来存储和获取与会话关联的数据的处理器的名字。默认为 files。参见 session_set_save_handler()。
session.save_path string
session.save_path 定义了传递给存储处理器的参数。如果选择了默认的 files 文件处理器,则此值是创建文件的路径。默认为 /tmp。参见 session_save_path()。
此指令还有一个可选的 n 参数来决定会话文件分布的目录深度。例如,设定为 \’5;/tmp\’ 将使创建的会话文件和路径类似于 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174if。要使用 n 参数,必须在使用前先创建好这些目录。在 ext/session 目录下有个小的 shell 脚本名叫 mod_files.sh 可以用来做这件事。此外注意如果使用了 n 参数并且 n 大于 0,那么将不会执行自动垃圾回收,更多信息见 php.ini。另外如果用了 n 参数,要确保将 session.save_path 的值用双引号 "quotes" 括起来,因为分隔符分号( ;)在 php.ini 中也是注释符号。
警告
如果将此设定为一个全局可读的目录,例如 /tmp(默认值),服务器上的其他用户有可能通过该目录的文件列表破解会话。
注意: 在 php 4.3.6 之前,windows 用户必须修改此选项以使用 php 的会话函数。必须指定一个合法路径,例如:c:/temp。
session.name string
session.name 指定会话名以用做 cookie 的名字。只能由字母数字组成,默认为 phpsessid。参见 session_name()。
session.auto_start boolean
session.auto_start 指定会话模块是否在请求开始时自动启动一个会话。默认为 0(不启动)。
session.serialize_handler string
session.serialize_handler 定义用来序列化/解序列化的处理器名字。当前支持 php 内部格式(名为 php)和 wddx(名为 wddx)。如果 php 编译时加入了 wddx 支持,则只能用 wddx。默认为 php。
——————————————-
session.gc_probability integer
session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。默认为 1。详见 session.gc_divisor。
session.gc_divisor integer
session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。
session.gc_maxlifetime integer
session.gc_maxlifetime 指定过了多少秒之后数据就会被视为“垃圾”并被清除。
注意: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。
注意: 如果使用默认的基于文件的会话处理器,则文件系统必须保持跟踪访问时间(atime)。windows fat 文件系统不行,因此如果必须使用 fat 文件系统或者其他不能跟踪 atime 的文件系统,那就不得不想别的办法来处理会话数据的垃圾回收。自 php 4.2.3 起用 mtime(修改时间)来代替了 atime。因此对于不能跟踪 atime 的文件系统也没问题了。
session.referer_check string
session.referer_check 包含有用来检查每个 http referer 的子串。如果客户端发送了 referer 信息但是在其中并未找到该子串,则嵌入的会话 id 会被标记为无效。默认为空字符串。
session.entropy_file string
session.entropy_file 给出了一个到外部资源(文件)的路径,该资源将在会话 id 创建进程中被用作附加的熵值资源。例如在许多 unix 系统下都可以用 /dev/random 或 /dev/urandom。
session.entropy_length integer
session.entropy_length 指定了从上面的文件中读取的字节数。默认为 0(禁用)。
session.use_cookies boolean
session.use_cookies 指定是否在客户端用 cookie 来存放会话 id。默认为 1(启用)。
session.use_only_cookies boolean
session.use_only_cookies 指定是否在客户端仅仅使用 cookie 来存放会话 id。。启用此设定可以防止有关通过 url 传递会话 id 的攻击。此设定是 php 4.3.0 添加的。
session.cookie_lifetime integer
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 boolean
session.cookie_secure 指定是否仅通过安全连接发送 cookie。默认为 off。此设定是 php 4.0.4 添加的。参见 session_get_cookie_params() 和 session_set_cookie_params()。
session.cache_limiter string
session.cache_limiter 指定会话页面所使用的缓冲控制方法(none/nocache/private/private_no_expire/public)。默认为 nocache。参见 session_cache_limiter()。
session.cache_expire integer
session.cache_expire 以分钟数指定缓冲的会话页面的存活期,此设定对 nocache 缓冲控制方法无效。默认为 180。参见 session_cache_expire()。
session.use_trans_sid boolean
session.use_trans_sid 指定是否启用透明 sid 支持。默认为 0(禁用)。
————————————————
注意: 对于 php 4.1.2 或以下版本,可以通过加入 –enable-trans-sid 配置选项去编译来启用,从 php 4.2.0 起,trans-sid 特性总是被编译。
基于 url 的会话管理比基于 cookie 的会话管理有更多安全风险。例如用户有可能通过 email 将一个包含有效的会话 id 的 url 发给他的朋友,或者用户总是有可能在收藏夹中存有一个包含会话 id 的 url 来以同样的会话 id 去访问站点。
session.bug_compat_42 boolean
php 4.2.3 以及更低版本有一个未公开的特性/错误,它允许用户在 register_globals 被禁用的情况下在全局范围内初始化一个会话变量。php 4.3.0 及更高版本会在使用此特性时并且启用了 session.bug_compat_warn 时发出警告。此特性/错误可以通过关闭此选项而禁用。
session.bug_compat_warn boolean
php 4.2.3 以及更低版本有一个未公开的特性/错误,它允许用户在 register_globals 被禁用的情况下在全局范围内初始化一个会话变量。php 4.3.0 及更高版本会在使用此特性时并且同时启用了 session.bug_compat_42 和 session.bug_compat_warn 时发出警告。
session.hash_function integer
session.hash_function 允许用户指定生成会话 id 的散列算法。\’0\’ 表示 md5(128 位),\’1\’ 表示 sha-1(160 位)。
注意: 这是 php 5 引进的。
session.hash_bits_per_character integer
session.hash_bits_per_character 允许用户定义将二进制散列数据转换为可读的格式时每个字符存放多少个比特。可能值为 \’4\’(0-9,a-f),\’5\’(0-9,a-v),以及 \’6\’(0-9,a-z,a-z,"-",",")。
注意: 这是 php 5 引进的。
url_rewriter.tags string
url_rewriter.tags 指定在使用透明 sid 支持时哪些 html 标记会被修改以加入会话 id。默认为 a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=。
注意: 如果要符合 xhtml,去掉 form 项并在表单字段前后加上 <fieldset> 标记。
track_vars 和 register_globals 配置选项影响到会话变量是怎样存储和恢复的。
注意: 自 php 4.0.3 起,track_vars 总是打开的。
资源类型
本扩展模块未定义任何资源类型。
预定义常量
以下常量由本扩展模块定义,因此只有在本扩展模块被编译到 php 中,或者在运行时被动态加载后才有效。
sid (string)
包含着会话名以及会话 id 的常量,格式为 "name=id",或者如果会话 id 已经在适当的会话 cookie 中设定时则为空字符串。
范例
注意: 自 php 4.1.0 起,&_session 如同 &_post,&_get,&_request 等一样成为全局数组。与 &http_session_vars 不同,&_session 总是具有全局范围。因此不要对 &_session 使用 global 关键字。注意本文档已被改为在所有地方都使用 &_session。如果倾向后者,可以将 &http_session_vars 都替换成 &_session。此外注意必须在使用 &_session 之前先用 session_start() 启动会话。
在 &_session 关联数组中的键名具有和 php 中普通变量名相同的规则,即不能以数字开头,必须以字母或下划线开头。更多细节见本手册中变量一章。
如果 register_globals 被禁用,则只有全局关联数组 &_session 中的成员可以被注册为会话变量。被恢复的会话变量也只存在于 &_session 数组中。
为提高安全性和代码的可读性,建议使用 &_session(或在 php 4.0.6 或更低版本中用 &http_session_vars)。使用了 &_session,就没有必要使用 session_register(),session_unregister(),session_is_registered() 函数。访问会话变量就和其它变量一样。 例 1. 用 &_session 注册变量
<?php
session_start();
// use &http_session_vars with php 4.0.6 or less
if (!isset(&_session[\'count\'])) {
&_session[\'count\'] = 0;
} else {
&_session[\'count\'] ;
}
?>
例 2. 用 &_session 取消注册变量并且禁用了 register_globals
<?php
session_start();
// use &http_session_vars with php 4.0.6 or less
unset(&_session[\'count\']);
?>
小心
不要用 unset(&_session) 取消了整个 &_session 数组,这样将不能再通过 &_session 超全局数组注册变量了。
警告
不能在会话变量中用引用,因为没有可行的方法将引用恢复到另一个变量去。
如果启用了 register_globals,则每个全局变量都能被注册为会话变量。在会话重新启动时,这些变量会被恢复到相应的全局变量中去。因为 php 必须知道哪些全局变量被注册为会话变量,用户需要用 session_register() 函数来注册变量。可以简单地通过在 &_session 中设定变量来免去这样做。
小心
在 php 4.3 之前,如果使用了 &_session 并且仅用了 register_globals,则不要使用 session_register(),session_is_registered() 或 session_unregister()。出于安全及性能原因,建议禁用 register_globals。
如果启用了 register_globals,则全局变量和 &_session 中的条目自动指向之前注册的同一个会话实例。不过如果变量是用 &_session 注册的,则全局变量自下一个请求起才可用。
在 php 4.2.3 和之前版本中有个缺陷。如果用 session_register() 注册了一个新的会话变量,则在全局变量范围中的条目和 &_session 中的条目在下一个 session_start() 之前没有引用到同一个值。即如果修改一个新注册的全局变量,不会在 &_session 条目中反应出来。这在 php 4.3 中已被修正。
传递会话 id
有两种方法传递一个会话 id:
cookie
url 参数
会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话 id 嵌入到 url 中间去。
php 可以透明地转换连接。除非是使用 php 4.2 或更新版本,需要手工在编译 php 时激活。在 unix 下,用 –enable-trans-sid 配置选项。如果此配置选项和运行时选项 session.use_trans_sid 都被激活,相对 uri 将被自动修改为包含会话 id。
注意: php.ini 指令 arg_separator.output 允许定制参数分隔符。为完全符合 xhtml,这里用 &。
此外,可以用常量 sid,在会话启动时被定义。如果客户端没有发送适当的会话 cookie 的话,则 sid 的格式为 session_name=session_id,否则就为一个空字符串。因此可以无条件将其嵌入到 url 中去。
下面例子演示了怎样注册一个变量,以及怎样用 sid 正确连接到另一个页面。 例 3. 对单一用户进行页面点击计数
<?php
if (!session_is_registered(\’count\’)) {
session_register(\’count\’);
&count = 1;
} else {
&count ;
}
?>
<p>
hello visitor, you have seen this page <?php echo &count; ?> times.
</p>
<p>
to continue, <a href="/nextpage.php?<?php echo strip_tags(sid); ?>">click
here</a>.
</p>
用 strip_tags() 来输出 sid 以避免 xss 相关的攻击。
如果编译 php 时指定了 –enable-trans-sid,就不需要像上例那样输出 sid 了。
注意: 非相对的 url 被假定为指向外部站点,因此没有附加 sid,因为这可能是个安全隐患将 sid 泄露给不同的服务器。
定制会话处理器
要实现数据库存储或其它储存方法,需要用 session_set_save_handler() 来创建一组用户级别的存储函数。
目录
session_cache_expire — return current cache expire
session_cache_limiter — get and/or set the current cache limiter
session_commit — session_write_close() 的别名
session_decode — decodes session data from a string
session_destroy — destroys all data registered to a session
session_encode — 将当前会话数据编码为一个字符串
session_get_cookie_params — get the session cookie parameters
session_id — get and/or set the current session id
session_is_registered — find out whether a global variable is registered in a session
session_module_name — get and/or set the current session module
session_name — get and/or set the current session name
session_regenerate_id — update the current session id with a newly generated one
session_register — register one or more global variables with the current session
session_save_path — get and/or set the current session save path
session_set_cookie_params — set the session cookie parameters
session_set_save_handler — sets user-level session storage functions
session_start — initialize session data
session_unregister — unregister a global variable from the current session
session_unset — free all session variables
session_write_close — write session data and end session