欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

php $_SESSION 赋一个变量,,设置失效时间 AG chatgpt 有大用 有大大用

php  $_SESSION 赋一个变量,,设置失效时间

在PHP中设置$_SESSION变量并指定失效时间

在PHP中,$_SESSION用于存储会话变量,但默认情况下会话数据会一直存在直到用户关闭浏览器。要设置会话变量的失效时间,以下几种方法:

方法1:设置会话cookie的过期时间

php
<?php // 开始会话之前设置cookie参数 ini_set('session.cookie_lifetime', 3600); // 1小时=3600秒 session_start(); // 设置会话变量 $_SESSION['user'] = 'JohnDoe'; ?>

方法2:在session_start()前使用session_set_cookie_params()

php
<?php // 设置会话cookie的生命周期为1小时 session_set_cookie_params(3600); session_start(); // 设置会话变量 $_SESSION['last_activity'] = time(); ?>

方法3:为单个会话变量设置自定义过期时间(推荐)

php
<?php session_start(); // 设置带过期时间的变量(60秒后过期) $_SESSION['temp_data'] = [    'value' => 'Some temporary data',    'expiry' => time() + 60 // 60秒后过期 ]; // 检查变量是否过期 if (isset($_SESSION['temp_data']) && time() > $_SESSION['temp_data']['expiry']) {    unset($_SESSION['temp_data']); } ?>

方法4:修改服务器的会话垃圾回收设置

php
<?php // 设置会话最长存活时间为1小时 ini_set('session.gc_maxlifetime', 3600); ini_set('session.gc_probability', 1); ini_set('session.gc_divisor', 100); session_start(); $_SESSION['user_prefs'] = ['theme' => 'dark']; ?>

最佳实践

  1. 对于临时数据,使用方法3(为单个变量设置过期时间)

  2. 对于整个会话,使用方法1或2设置全局过期时间

  3. 记得在每次请求时检查变量是否过期

php
// 示例:检查并清理过期会话变量 session_start(); foreach ($_SESSION as $key => $value) {    if (isset($value['expiry']) && time() > $value['expiry']) {        unset($_SESSION[$key]);    } }

drupal 7  d7  drupal7  $_SESSION 赋一个变量,,设置失效时间

在Drupal 7中设置$_SESSION变量及其失效时间

在Drupal 7中处理会话变量与原生PHP有所不同,因为Drupal有自己的会话处理机制。以下是几种在Drupal 7中设置会话变量并控制其失效时间的方法:

方法1:使用drupal_session_start()和原生PHP方式

php
// 确保Drupal会话已启动(通常在Drupal bootstrap中已经处理) drupal_session_start(); // 设置带过期时间的会话变量(30分钟后过期) $_SESSION['custom_data'] = array(  'value' => '这是要存储的数据',  'expire' => REQUEST_TIME + 1800 // 1800秒 = 30分钟 );

方法2:使用Drupal的drupal_set_session()函数

php
// 设置会话变量 drupal_set_session('custom_key', '自定义值'); // 如果需要设置过期时间,可以结合原生方式 $_SESSION['custom_key_expire'] = array(  'value' => '自定义值',  'expire' => REQUEST_TIME + 3600 // 1小时后过期 );

方法3:创建自定义模块使用hook_boot()检查过期

php
/** * 实现hook_boot() */ function mymodule_boot() {  // 检查并清理过期的会话变量  foreach ($_SESSION as $key => $data) {    if (isset($data['expire']) && REQUEST_TIME > $data['expire']) {      unset($_SESSION[$key]);    }  } }

方法4:修改Drupal的会话设置全局过期时间

可以在settings.php中修改全局会话设置:

php
// 设置会话cookie生命期为2小时(7200秒) ini_set('session.cookie_lifetime', 7200); // 或者使用Drupal的方式 $conf['session_cookie_lifetime'] = 7200;

最佳实践示例

php
// 在自定义模块中设置带过期时间的会话变量 function mymodule_set_temp_data($key, $value, $expire = 3600) {  $_SESSION['mymodule_' . $key] = array(    'data' => $value,    'expire' => REQUEST_TIME + $expire  ); } // 获取数据时检查是否过期 function mymodule_get_temp_data($key) {  if (isset($_SESSION['mymodule_' . $key])) {    $data = $_SESSION['mymodule_' . $key];    if (REQUEST_TIME < $data['expire']) {      return $data['data'];    } else {      unset($_SESSION['mymodule_' . $key]);    }  }  return FALSE; }

注意事项

  1. Drupal会自动处理会话的启动,通常不需要手动调用session_start()

  2. 使用Drupal的全局时间戳REQUEST_TIME而不是time()

  3. 会话变量键名前最好加上模块前缀防止冲突

  4. 对于重要数据,考虑使用Drupal的缓存API而不是会话变量

记住,在Drupal中处理会话相比原生PHP更推荐使用Drupal提供的API和最佳实践。



if(!empty($arr['command']['command_uuid'])){

//            var_dump($arr['command']['command_uuid']);exit;

            if(empty($_SESSION['computer_command'][$computer_id][$command_name])){

                $_SESSION['computer_command'][$computer_id][$command_name]=array();

            }

            $_SESSION['computer_command'][$computer_id][$command_name][] = $arr['command']['command_uuid'];

            drupal_json_output(array("status" => 'ok', "data" => "命令已发出"));

        }  设置失效时间

在你的代码中为 $_SESSION['computer_command'] 设置失效时间,可以采用以下方法:

方法1:为每个命令添加时间戳和过期时间

php
if (!empty($arr['command']['command_uuid'])) {    if (empty($_SESSION['computer_command'][$computer_id][$command_name])) {        $_SESSION['computer_command'][$computer_id][$command_name] = array();    }        // 添加命令UUID同时记录时间和过期时间(例如1小时后过期)    $_SESSION['computer_command'][$computer_id][$command_name][] = array(        'uuid' => $arr['command']['command_uuid'],        'timestamp' => REQUEST_TIME,        'expire' => REQUEST_TIME + 3600 // 3600秒=1小时    );        drupal_json_output(array("status" => 'ok', "data" => "命令已发出")); }

方法2:添加全局会话过期检查函数

php
/** * 检查并清理过期的命令 */ function _check_expired_commands() {    if (!empty($_SESSION['computer_command'])) {        foreach ($_SESSION['computer_command'] as $computer_id => $commands) {            foreach ($commands as $command_name => $command_entries) {                foreach ($command_entries as $index => $entry) {                    if (isset($entry['expire']) && REQUEST_TIME > $entry['expire']) {                        unset($_SESSION['computer_command'][$computer_id][$command_name][$index]);                    }                }                // 清理空数组                if (empty($_SESSION['computer_command'][$computer_id][$command_name])) {                    unset($_SESSION['computer_command'][$computer_id][$command_name]);                }            }            // 清理空的计算机记录            if (empty($_SESSION['computer_command'][$computer_id])) {                unset($_SESSION['computer_command'][$computer_id]);            }        }    } } // 在适当的地方调用这个函数,比如hook_boot()或每次访问命令时 _check_expired_commands();

方法3:修改你的原始代码集成过期检查

php
if (!empty($arr['command']['command_uuid'])) {    // 先清理过期的命令    _check_expired_commands();        if (empty($_SESSION['computer_command'][$computer_id][$command_name])) {        $_SESSION['computer_command'][$computer_id][$command_name] = array();    }        // 添加带过期时间的命令记录    $_SESSION['computer_command'][$computer_id][$command_name][] = array(        'uuid' => $arr['command']['command_uuid'],        'timestamp' => REQUEST_TIME,        'expire' => REQUEST_TIME + 3600 // 1小时后过期    );        drupal_json_output(array("status" => 'ok', "data" => "命令已发出")); }

最佳实践建议

  1. 固定过期时间:为所有命令设置统一的过期时间,存储在变量中方便修改

  2. 清理机制:在hook_boot()或hook_init()中定期清理过期命令

  3. 数据结构:保持数据结构一致,便于维护

php
// 在settings.php或模块中定义过期时间 $conf['command_expire_time'] = 3600; // 1小时 // 使用时 $expire_time = variable_get('command_expire_time', 3600); $_SESSION['computer_command'][$computer_id][$command_name][] = array(    'uuid' => $arr['command']['command_uuid'],    'timestamp' => REQUEST_TIME,    'expire' => REQUEST_TIME + $expire_time );

这样你的命令系统就会有自动过期的功能,同时保持代码的整洁和可维护性。


普通分类: