关于Session中的session.gc_*

PHP Session 超时机制详解
本文详细解析了PHP中Session的超时机制,包括如何通过配置session.gc_maxlifetime来控制Session文件的有效时间,以及session.cookie_lifetime对于Session过期时间的影响。并通过示例代码展示了如何设置这些参数。
关于登录超时,自动退出页面的问题!


我的做法是: 通过Session 控制

失败1:在 php.ini 中设定 session 失效的时间,我设置session.gc_maxlifetime为180,可是我等了足足5分钟(可能有8分钟),可是我依然能进入系统.设置后有重启linux.

失败2:在 程序中插入函数 ini_set('session.gc_maxlifetime',180);(session_start前加入),超时后依然能进入.


一开始我也不是很明白,想当然的以为这个是用来控制Session文件的.这里设置的时间,过期后,/tmp/sess_*的文件就会自动删除.

后来自己做了一下测试好象也不行.

看文档发现,在session的configure option中有三个关于gc的,分别是:


session.gc_probability "1" PHP_INI_ALL
session.gc_divisor "100" PHP_INI_ALL Available since PHP 4.3.2.
session.gc_maxlifetime "1440" PHP_INI_ALL


咱们一个个看.

首先 gc是什么?

gc, 是garbage collection 的简称.这个进程一般都跟着每起一个SESSION而开始运行的.gc目的是为了在session文件过期以后自动销毁删除这些文件. 大家应该猜到三个参数的大致用处了吧?

1、session_gc_probaility

PHP默认不是每个SESSION启动都会启动一个GC来跟踪。这个参数是控制gc跟session启动概率。默认 1。值越大,概率越大。

2、session.gc_divisor

功能同上。 默认100。值越小,概率越大。

3、session.gc_maxlifetime

超过设定时间,gc就认为是垃圾文件。

总结

session_gc_probaility和session.gc_divisor是一对控制gc启动的概率的两个参数。前者是分子,后者是分母。默认是1/100。 1%的几率。 也就是说100个请求中只有一个gc会伴随100个中的某个请求而启动。


而关于SESSION 过期大家也应该有更明确的认识

只有session.cookie_lifetime 控制SESSIOn的过期时间.

可以通过直接修改ini,或者通过ini_set();以及session_set_cookie_params()来修改。


<?php
ini_set("session.gc_divisor", 1);
ini_set("session.gc_maxlifetime", 5);
ini_set("session.cookie_lifetime", 10);

session_start();

if (isset($_SESSION['test']))
{
echo SESSION_ID();
echo "<br>";
echo $_SESSION['test'];
}
else
{
$_SESSION['test'] = date("Y-M-D H:i:s");
}

echo "<br>";
echo ini_get("session.gc_maxlifetime");
echo "<br>";
echo ini_get("session.cookie_lifetime");


?>


这种情况下,gc的最大过期时间比 Session的过期时间短,但是还是按照session的过期时间过期。

注意: WEB是触发式的。所以在你直接关闭IE的情况下,session文件也是依然会存在的。

注意:
1、session默认以文件方式保存,不过太多的session在一个目录下是不利于存取的。php.ini里面有个设置可以让session分子目录保存
session.save_path = "N;/path" N表示几级子目录,比如你可以设置成 session.save_path = "2;/tmp"
但是你设置成分子目录后,原来的garbage collection 就没用了,需要你自己去清楚过期session,比如用个shell定时执行。
(以上内容大家仔细看看php.ini里面的注释就知道了)

2、很多人都习惯在php程序的头部打开session就不管它了,程序结束会自动关闭session的。不过从性能上考虑session应该尽早关闭,特别是多于执行时间比较长的程序。因为session文件在打开的时候是独占的,比如a.php打开了的session文件后并不关闭,而本身程序要执行比较长时间。同时你打开了b.php也是需要session的,就要等a.php执行完才能打开了。

所以建议a.php预先处理好session,然后关闭它,在执行其他功能。
xdebug xdebug support enabled Version 2.9.4 Support Xdebug on Patreon, GitHub, or as a business Debugger enabled IDE Key PHPSTORM Directive Local Value Master Value xdebug.auto_trace On On xdebug.cli_color 0 0 xdebug.collect_assignments Off Off xdebug.collect_includes On On xdebug.collect_params 1 1 xdebug.collect_return On On xdebug.collect_vars Off Off xdebug.coverage_enable On On xdebug.default_enable On On xdebug.dump.COOKIE no value no value xdebug.dump.ENV no value no value xdebug.dump.FILES no value no value xdebug.dump.GET no value no value xdebug.dump.POST no value no value xdebug.dump.REQUEST no value no value xdebug.dump.SERVER no value no value xdebug.dump.SESSION no value no value xdebug.dump_globals On On xdebug.dump_once On On xdebug.dump_undefined Off Off xdebug.file_link_format no value no value xdebug.filename_format no value no value xdebug.force_display_errors Off Off xdebug.force_error_reporting 0 0 xdebug.gc_stats_enable Off Off xdebug.gc_stats_output_dir C:\Windows\Temp C:\Windows\Temp xdebug.gc_stats_output_name gcstats.%p gcstats.%p xdebug.halt_level 0 0 xdebug.idekey PHPSTORM PHPSTORM xdebug.max_nesting_level 256 256 xdebug.max_stack_frames -1 -1 xdebug.overload_var_dump 2 2 xdebug.profiler_append Off Off xdebug.profiler_enable On On xdebug.profiler_enable_trigger Off Off xdebug.profiler_enable_trigger_value no value no value xdebug.profiler_output_dir D:/software/phpstudy_pro/Extensions/php_log/php7.4.3nts.xdebug.profiler D:/software/phpstudy_pro/Extensions/php_log/php7.4.3nts.xdebug.profiler xdebug.profiler_output_name cachegrind.out.%p cachegrind.out.%p xdebug.remote_addr_header no value no value xdebug.remote_autostart Off Off xdebug.remote_connect_back Off Off xdebug.remote_cookie_expire_time 3600 3600 xdebug.remote_enable Off Off xdebug.remote_host localhost localhost xdebug.remote_log no value no value xdebug.remote_log_level 7 7 xdebug.remote_mode req req xdebug.remote_port 9000 9000 xdebug.remote_timeout 200 200 xdebug.scream Off Off xdebug.show_error_trace Off Off xdebug.show_exception_trace Off Off xdebug.show_local_vars Off Off xdebug.show_mem_delta Off Off xdebug.trace_enable_trigger Off Off xdebug.trace_enable_trigger_value no value no value xdebug.trace_format 0 0 xdebug.trace_options 0 0 xdebug.trace_output_dir D:/software/phpstudy_pro/Extensions/php_log/php7.4.3nts.xdebug.trace D:/software/phpstudy_pro/Extensions/php_log/php7.4.3nts.xdebug.trace xdebug.trace_output_name trace.%c trace.%c xdebug.var_display_max_children 128 128 xdebug.var_display_max_data 512 512 xdebug.var_display_max_depth 3 3 修改php.ini配置后phpinfo中并没有client_port的相关信息,配置如下 [Xdebug] zend_extension=D:/software/phpstudy_pro/Extensions/php/php7.4.3nts/ext/php_xdebug.dll xdebug.collect_params=1 xdebug.collect_return=1 xdebug.auto_trace=On xdebug.trace_output_dir=D:/software/phpstudy_pro/Extensions/php_log/php7.4.3nts.xdebug.trace xdebug.profiler_enable=On xdebug.profiler_output_dir=D:/software/phpstudy_pro/Extensions/php_log/php7.4.3nts.xdebug.profiler xdebug.remote_enable=Off xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.remote_handler=dbgp xdebug.idekey=PHPSTORM xdebug.mode=debug xdebug.client_host=localhost xdebug.client_port=9003 xdebug.start_with_request=yes
最新发布
06-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值