Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中更改会话超时?_Php_Session_Session Timeout - Fatal编程技术网

如何在PHP中更改会话超时?

如何在PHP中更改会话超时?,php,session,session-timeout,Php,Session,Session Timeout,我想用php扩展会话超时 我知道通过修改php.ini文件可以做到这一点。 但我没办法得到它 那么,是否可以只使用php代码来实现这一点呢?否。 如果您没有访问php.ini的权限,则无法保证更改会产生任何效果 不过,我怀疑您是否需要延长会议时间。 目前它有相当合理的超时时间,没有理由延长它 您可以使用ini\u set()从php代码中重写php.ini中的值,如果您希望得到严格的保证,会话超时是一个必须在代码中实现的概念;这是唯一可以绝对确定的方法,在X分钟的不活动后,任何会话都无法生存 如

我想用php扩展会话超时

我知道通过修改php.ini文件可以做到这一点。 但我没办法得到它

那么,是否可以只使用php代码来实现这一点呢?

否。 如果您没有访问php.ini的权限,则无法保证更改会产生任何效果

不过,我怀疑您是否需要延长会议时间。

目前它有相当合理的超时时间,没有理由延长它

您可以使用
ini\u set()

从php代码中重写php.ini中的值,如果您希望得到严格的保证,会话超时是一个必须在代码中实现的概念;这是唯一可以绝对确定的方法,在X分钟的不活动后,任何会话都无法生存

如果稍微放宽这一要求是可以接受的,并且您可以设置一个下限,而不是严格限制持续时间,那么您可以轻松地做到这一点,而无需编写自定义逻辑

轻松环境中的便利性:如何和为什么 如果您的会话是通过cookie实现的(它们可能是),并且如果客户端不是恶意的,您可以通过调整某些参数来设置会话持续时间的上限。如果使用PHP的默认会话处理Cookie,则设置应与一起工作,如下所示:

// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);

// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);

session_start(); // ready to go!
这是通过配置服务器使会话数据保持至少一个小时的不活动状态,并指示客户端在相同的时间跨度后应“忘记”会话id来实现的这两个步骤都是实现预期结果所必需的。

  • 如果您不告诉客户端在一小时后忘记其会话id(或者如果客户端是恶意的,并且选择忽略您的指示),他们将继续使用相同的会话id,其有效持续时间将是不确定的。这是因为在服务器端其生存期已过期的会话不会立即被垃圾收集,而只会被垃圾收集

    GC是一个潜在的昂贵过程,因此通常概率很小,甚至为零(一个获得大量点击的网站可能会完全放弃概率GC,并计划每X分钟在后台进行一次)。在这两种情况下(假设不合作的客户端),有效会话生存时间的下限将是
    session.gc_maxlifest
    ,但上限将是不可预测的

  • 如果未将
    session.gc\u maxlifest
    设置为相同的时间跨度,则服务器可能会在该时间跨度之前丢弃空闲会话数据;在这种情况下,仍然记得会话id的客户机将显示会话id,但服务器将找不到与该会话相关的数据,有效地表现为会话刚刚启动

关键环境中的确定性 您可以通过使用自定义逻辑来设置会话不活动的上限,从而使事情完全可控;加上上面的下限,这将导致严格的设置

通过将上限与其余会话数据一起保存来执行此操作:

session_start(); // ready to go!

$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
    // this session has worn out its welcome; kill it and start a brand new one
    session_unset();
    session_destroy();
    session_start();
}

// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;
会话id持久性
到目前为止,我们根本不关心每个会话id的确切值,只关心数据应该存在多久就存在多久的要求。请注意,在会话id对您很重要的情况下(不太可能),必须注意在需要时使用
会话\u reneage\u id
重新生成会话id。

如果使用PHP的默认会话处理,在所有平台上可靠更改会话持续时间的唯一方法是更改PHP.ini。这是因为在某些平台中,垃圾收集是通过一个每次运行的脚本(cron脚本)来实现的,该脚本直接从php.ini读取,因此在运行时对其进行任何更改的尝试(例如通过
ini\u set()
)都是不可靠的,很可能无法工作

例如,在Debian Linux系统中,PHP的内部垃圾收集是通过在配置中默认设置
session.gc_probability=0
来禁用的,而是通过/etc/cron.d/PHP来完成的,它在XX:09和XX:39(即每半小时)运行一次。此cron作业查找早于配置中指定的会话.gc_maxlife的会话,如果找到任何会话,则将删除它们。因此,在这些系统中,
ini\u集('session.gc\u maxlifest',…)
被忽略。这也解释了为什么在这个问题中,OP在一台主机上出现问题,但在切换到另一台主机时问题停止了

因此,考虑到您没有访问php.ini的权限,如果您希望以可移植的方式进行访问,那么使用默认会话处理不是一个选项。显然,延长cookie生存期对主机来说已经足够了,但是如果您想要一个即使切换主机也能可靠工作的解决方案,您必须使用不同的替代方案

可用的替代方法包括:

  • 在PHP中设置一个不同的会话(save)处理程序,以将会话保存在不同的目录或数据库中,如中所指定,这样cron作业就不会到达它,而只进行PHP的内部垃圾收集。此选项可能可以使用
    ini\u set()
    来设置会话。gc\u maxlifetime,但我更愿意忽略我的
    gc()
    回调中的maxlifetime参数,并自行确定最大生存期


  • 完全忘记PHP内部会话处理,实现自己的会话管理。此方法有两个主要缺点:您将需要自己的全局会话变量,因此您失去了
    $\u session
    超全局的优势,并且它需要更多的代码,因此存在更多的bug和安全缺陷。最重要的是,会话标识符应该由加密安全的随机数或伪随机数生成,以避免会话
    <?php
    class FileSessionHandler
    {
    
        private $savePath;
        private $lifetime;
    
        function open($savePath, $sessionName)
        {
            $this->savePath = 'my_savepath'; // Ignore savepath and use our own to keep it safe from automatic GC
            $this->lifetime = 3600; // 1 hour minimum session duration
            if (!is_dir($this->savePath)) {
                mkdir($this->savePath, 0777);
            }
    
            return true;
        }
    
        function close()
        {
            return true;
        }
    
        function read($id)
        {
            return (string)@file_get_contents("$this->savePath/sess_$id");
        }
    
        function write($id, $data)
        {
            return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
        }
    
        function destroy($id)
        {
            $file = "$this->savePath/sess_$id";
            if (file_exists($file)) {
                unlink($file);
            }
    
            return true;
        }
    
        function gc($maxlifetime)
        {
            foreach (glob("$this->savePath/sess_*") as $file) {
                if (filemtime($file) + $this->lifetime < time() && file_exists($file)) { // Use our own lifetime
                    unlink($file);
                }
            }
    
            return true;
        }
    }
    
    $handler = new FileSessionHandler();
    session_set_save_handler(
        array($handler, 'open'),
        array($handler, 'close'),
        array($handler, 'read'),
        array($handler, 'write'),
        array($handler, 'destroy'),
        array($handler, 'gc')
        );
    
    // the following prevents unexpected effects when using objects as save handlers
    register_shutdown_function('session_write_close');
    
    session_set_cookie_params(3600); // Set session cookie duration to 1 hour
    session_start();
    // proceed to set and retrieve values by key from $_SESSION
    
    if(time() - $_SESSION['login_time'] >= 1800){
        session_destroy(); // destroy session.
        header("Location: logout.php");
        die(); // See https://thedailywtf.com/articles/WellIntentioned-Destruction
        //redirect if the page is inactive for 30 minutes
    }
    else {        
       $_SESSION['login_time'] = time();
       // update 'login_time' to the last time a page containing this code was accessed.
    }
    
    mv /etc/cron.hourly/plesk-php-cleanuper /etc/cron.daily/
    
    php_value session.save_path /home/server/.folderA_sessionsA
    php_value session.gc_maxlifetime 57600
    php_value session.cookie_lifetime 57600
    php_value session.cache_expire 57600
    php_value session.name MyDomainA