查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!
标题吸引到你了吗?
先说一下这个题问成形的原因。大家都晓得 session是靠cookie中的session_id来传递的,但是 swfupload是靠flash来上传的。 flash不并会把非IE浏览器上面以后面页cookie发送到目标面页 这样由于以后面页的cookie不会传递给flash请求的目标地址 因此请求的文件发送到目标地址就是一个新的session了 当然这个session就没有意义了
但是经过我本人试测 这个BUG重要还是和户客安装的FLASH本版也有关,比如我昨天在win7 64位系统 最新本版flash上面就没有这个题问
现在来讲用swfupload也好久了 之前用的时候 碰到session丧失的题问 基本上 都是在项目action的面页上断判 直接断判post值传过去的 session_id 如果有的话就赋值给session
附代码:
// 重塑Session (必须位于session_start()之前)
if (isset($_POST['PHPSESSID'])) {session_id($_POST['PHPSESSID']);
}
session_start();
但是 直接写在项目里头 不并是别特的想理 而且大大降低了项目的可扩展性 和合耦性
其实 关于session这一块可以独单的封装成一个函数括包session的新增 验证 除删 和取获 都可以封装成一个函数
首先在配置文件里头 设置session_id 的配置文件 然后在session 函数里头验证
if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){session_id($_REQUEST[C('VAR_SESSION_ID')]);}elseif(isset($name['id'])) {session_id($name['id']);}ini_set('session.auto_start', 0);
这样直接写在session函数里头 以可就很完善的取获post的session了 最后关闭php动自开启session 改成自己手动开启
这样 分离了业务逻辑 对于项目说来 张扩性提高了很多
附session函数 (thinkphp供提)
冰心说道:“爱在左,同情在右,走在生命的两旁,随时撒种,随时开花,将这一径长途,点缀得香花弥漫,使穿枝拂叶的行人,踏着荆棘,不觉得痛苦,有泪可落,却不是悲凉。”
function session($name,$value='') {$prefix = C('SESSION_PREFIX');if(is_array($name)) { // session初始化 在session_start 之前调用if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){session_id($_REQUEST[C('VAR_SESSION_ID')]);}elseif(isset($name['id'])) {session_id($name['id']);}ini_set('session.auto_start', 0);if(isset($name['name'])) session_name($name['name']);if(isset($name['path'])) session_save_path($name['path']);if(isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']);if(isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']);if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0);if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0);if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']);if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']);if(isset($name['type'])) C('SESSION_TYPE',$name['type']);if(C('SESSION_TYPE')) { // 读取session动驱$class = 'Session'. ucwords(strtolower(C('SESSION_TYPE')));// 检查动驱类if(require_cache(EXTEND_PATH.'Driver/Session/'.$class.'.class.php')) {$hander = new $class();$hander->execute();}else {// 类没有定义throw_exception(L('_CLASS_NOT_EXIST_').': ' . $class);}}// 启动sessionif(C('SESSION_AUTO_START')) session_start();}elseif('' === $value){ if(0===strpos($name,'[')) { // session 操纵if('[pause]'==$name){ // 暂停sessionsession_write_close();}elseif('[start]'==$name){ // 启动sessionsession_start();}elseif('[destroy]'==$name){ // 销毁session$_SESSION = array();session_unset();session_destroy();}elseif('[regenerate]'==$name){ // 从新成生idsession_regenerate_id();}}elseif(0===strpos($name,'?')){ // 检查session$name = substr($name,1);if($prefix) {return isset($_SESSION[$prefix][$name]);}else{return isset($_SESSION[$name]);}}elseif(is_null($name)){ // 清空sessionif($prefix) {unset($_SESSION[$prefix]);}else{$_SESSION = array();}}elseif($prefix){ // 取获sessionreturn isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;}else{return isset($_SESSION[$name])?$_SESSION[$name]:null;}}elseif(is_null($value)){ // 除删sessionif($prefix){unset($_SESSION[$prefix][$name]);}else{unset($_SESSION[$name]);}}else{ // 设置sessionif($prefix){if (!is_array($_SESSION[$prefix])) {$_SESSION[$prefix] = array();}$_SESSION[$prefix][$name] = $value;}else{$_SESSION[$name] = $value;}}
}
文章结束给大家分享下程序员的一些笑话语录: 一个合格的程序员是不会写出 诸如 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去。