我的问题很快被描述为需要在不更改php.ini的情况下将会话数据寿命延长到php.ini中的默认设置。我正在寻找一种解决方案,可以应用于多个不同的php设置跨服务器平台,所以没有必要为每次安装更改脚本。
因为我不想改变服务器上的默认值,并希望尽可能独立于我的脚本,我正在寻找一种方法来超过默认的1440秒,这是为垃圾收集器设置的,以过早地处置我的会话数据。简单设置ini_set('session.gc_maxlifetime',36000);
在一些服务器上,GC将不受php设置的影响运行,并在24分钟后删除我的会话。为了解决这个问题,作者建议改变会话。Save_path到另一个不受操作系统gc影响的文件夹,从而强制执行set会话。Gc_maxlifetime到我的设置。不幸的是,我无法在php的tmp空间内创建一个临时文件夹,虽然我喜欢这样做,但我似乎无法做到,因为我在大多数服务器上没有0600访问权限。
一个解决方案是将我的会话数据链接到我在共享主机文件夹中创建的自己的文件夹,但这似乎不安全,因为这个文件夹必须在线可用,因此暴露于可能的id盗窃。虽然我不知道是不是这样。
另一个解决方案是包括$_SESSION["stayalaive"]=time();
,因为gc只删除登录脚本特定时间内未触及的会话,因此每次调用登录脚本时会话将被扩展,尽管这意味着如果用户不点击任何东西24分钟,会话将被删除,这是我可能会接受的,但它似乎也把另一个进程,似乎不必要。
所以我的问题是如何设置我的会话数据保持存活10小时而不为它计时太多的性能
我以前在脚本中使用过php.ini指令,除此之外,你可以在你的主机保留空间中创建目录。
所以(在你的脚本的开头)这必须是工作,毫无疑问:
<?php
// obtain current directory
$APPPATH = dirname(__FILE__);
if ( ! file_exists($APPPATH . '/tmp/sessions'))
{
mkdir($APPPATH . '/tmp/sessions', 0700, TRUE);
}
ini_set('session.save_path', $APPPATH . '/tmp/sessions');
ini_set('session.gc_maxlifetime', 36000);
session_start();
?>
两个指令都有PHP_INI_ALL可变模式,所以可以在脚本中设置。
任何称职的网络主机都会在你的public_html(或其他)文件夹上面给你一个目录。如果你的目录有,那么你可以在那里为会话创建一个目录,它将无法从web访问。
如果你的主机是如此糟糕,任何你可以通过FTP/SSH/其他方式触摸的东西也可以通过HTTP访问,事情就更烦人了。
假设你有一个糟糕的主机,这里有一些想法:
1)将会话存储在你的web根目录中,并使用。htaccess使其不可浏览。
2)在数据库中存储会话数据。
这两个选项中的任何一个都应该允许您通过ini-set()设置自己的垃圾收集规则,并避免其他进程破坏您的会话。