欢迎各位兄弟 发布技术文章
这里的技术是共享的
php $_SESSION 赋一个变量,,设置失效时间
在PHP中,$_SESSION
用于存储会话变量,但默认情况下会话数据会一直存在直到用户关闭浏览器。要设置会话变量的失效时间,以下几种方法:
php<?php // 开始会话之前设置cookie参数 ini_set('session.cookie_lifetime', 3600); // 1小时=3600秒 session_start(); // 设置会话变量 $_SESSION['user'] = 'JohnDoe'; ?>
php<?php // 设置会话cookie的生命周期为1小时 session_set_cookie_params(3600); session_start(); // 设置会话变量 $_SESSION['last_activity'] = time(); ?>
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']); } ?>
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']; ?>
对于临时数据,使用方法3(为单个变量设置过期时间)
对于整个会话,使用方法1或2设置全局过期时间
记得在每次请求时检查变量是否过期
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中处理会话变量与原生PHP有所不同,因为Drupal有自己的会话处理机制。以下是几种在Drupal 7中设置会话变量并控制其失效时间的方法:
php// 确保Drupal会话已启动(通常在Drupal bootstrap中已经处理) drupal_session_start(); // 设置带过期时间的会话变量(30分钟后过期) $_SESSION['custom_data'] = array( 'value' => '这是要存储的数据', 'expire' => REQUEST_TIME + 1800 // 1800秒 = 30分钟 );
php// 设置会话变量 drupal_set_session('custom_key', '自定义值'); // 如果需要设置过期时间,可以结合原生方式 $_SESSION['custom_key_expire'] = array( 'value' => '自定义值', 'expire' => REQUEST_TIME + 3600 // 1小时后过期 );
php/** * 实现hook_boot() */ function mymodule_boot() { // 检查并清理过期的会话变量 foreach ($_SESSION as $key => $data) { if (isset($data['expire']) && REQUEST_TIME > $data['expire']) { unset($_SESSION[$key]); } } }
可以在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; }
Drupal会自动处理会话的启动,通常不需要手动调用session_start()
使用Drupal的全局时间戳REQUEST_TIME
而不是time()
会话变量键名前最好加上模块前缀防止冲突
对于重要数据,考虑使用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']
设置失效时间,可以采用以下方法:
phpif (!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" => "命令已发出")); }
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();
phpif (!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" => "命令已发出")); }
固定过期时间:为所有命令设置统一的过期时间,存储在变量中方便修改
清理机制:在hook_boot()或hook_init()中定期清理过期命令
数据结构:保持数据结构一致,便于维护
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 );
这样你的命令系统就会有自动过期的功能,同时保持代码的整洁和可维护性。