3

我的问题很快被描述为需要在不更改 php.ini 的情况下将会话数据寿命延长到 php.ini 中的默认设置之上。我正在寻找一种可应用于跨服务器平台的多种不同 php 设置的解决方案,因此无需为每次安装更改脚本。

由于我不想更改服务器上的默认设置并希望尽可能地独立使用我的脚本,我正在寻找一种方法来超过为垃圾收集器设置的默认 1440 秒,以便过早地处理我的会话数据。简单地设置ini_set('session.gc_maxlifetime',36000); 为 10 小时将不起作用,因为在某些服务器上,GC 将不受 php 设置的影响运行,并且无论如何都会在 24 分钟后删除我的会话,如此所述。为了解决这个问题,作者建议将 session.save_path 更改为不受操作系统 gc 影响的另一个文件夹,从而将 set session.gc_maxlifetime 强制设置为我的设置。不幸的是,我无法在 php 的 tmp 空间中创建一个临时文件夹,尽管我喜欢我似乎无法做到,因为我在大多数服务器上都没有 0600 访问权限。

一种解决方案是将我的会话数据链接到在我的共享主机文件夹中创建的我自己的文件夹,但这似乎不安全,因为该文件夹必须在线可用,因此可能会被盗。虽然我不知道是不是这样。

另一个解决方案是包括$_SESSION["stayalaive"]=time();,因为 gc 仅删除登录脚本在特定时间内未触及的会话,以便每次调用登录脚本时都会扩展会话,但这意味着如果用户在 24 分钟内没有单击任何内容无论如何,会话将被删除,这是我可以忍受的,但它似乎也加入了另一个似乎不必要的过程。

所以我的问题是如何设置我的会话数据以保持活动 10 小时而不会为其提供太多性能。

4

2 回答 2

3

我之前在脚本中使用过 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可变模式,所以可以在脚本中设置。

于 2011-11-16T02:33:43.373 回答
0

任何值得他们盐分的网络主机都会在您的 public_html(或其他)文件夹上方为您提供一个目录。如果您这样做,那么您可以在那里为会话创建一个目录,并且无法从 Web 访问它。

如果您的主机如此糟糕,以至于您可以通过 FTP/SSH 触摸的任何东西/任何东西都可以通过 HTTP 访问,那么事情就更烦人了。

所以假设你有一个糟糕的主机,这里有一些想法:

1) 将会话存储在您的 Web 根目录中,并使用 .htaccess 使其不可浏览。

2) 将会话数据存储在数据库中。

这些选项中的任何一个都应该使您能够通过 ini-set() 设置自己的垃圾收集规则,并避免让其他进程破坏您的会话。

于 2011-11-16T02:41:18.667 回答