免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1983 | 回复: 4
打印 上一主题 下一主题

把session写进APC里遇到了问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-19 10:20 |只看该作者 |倒序浏览
试着把session写在了APC里,可是结果发现,我无法结束这个session,造成了程序功能上用户无法注销系统登陆。这个问题,请教大家有没有别提处理方法呢?
  1. class CSessAPC {

  2.         public function add( $key, $data, $cg_maxlifetime ) {
  3.                 apc_store( $key, $data, $cg_maxlifetime );
  4.                 return true;
  5.         }

  6.         public function fetch( $key ) {
  7.                 if ( !apc_exists( $key ) ) {
  8.                         apc_store( $key, '' );
  9.                         return true;
  10.                 }
  11.                 return apc_fetch( $key );
  12.         }

  13.         public function delete( $key ) {
  14.                 apc_delete( $key );
  15.                 return true;
  16.         }
  17. };




  18. class CSession {

  19.         private static $engine;
  20.         private static $gc_maxlifetime;

  21.         public static function engine( $enginer ) {
  22.                 switch( $enginer ) {
  23.                         case 'apc':
  24.                                 $handler = new CSession( new CSessAPC() );
  25.                                 break;
  26.                        
  27.                         default:
  28.                                 $handler = new CSession( new CSessFile() );
  29.                                 break;
  30.                 }

  31.                 ini_set( "session.save_handler", "user" );
  32.                 session_set_save_handler(
  33.                         array($handler, 'open'),
  34.                         array($handler, 'close'),
  35.                         array($handler, 'read'),
  36.                         array($handler, 'write'),
  37.                         array($handler, 'destroy'),
  38.                         array($handler, 'gc')
  39.                 );
  40.         }

  41.         public function __construct( & $engine ) {
  42.                 self::$engine = $engine;
  43.                 self::$gc_maxlifetime = ini_get( 'session.gc_maxlifetime' );
  44.         }

  45.         public function read( $id ) {
  46.                 $key = "session/".$id;
  47.                 return self::$engine->fetch( $key );
  48.         }

  49.         public function write ( $id , $data ) {
  50.                 $key = 'session/'.$id;
  51.                 self::$engine->add( $key, $data, self::$gc_maxlifetime );
  52.                 return true;
  53.         }

  54.         public function close ( ) {
  55.                 session_write_close();
  56.                 return true;
  57.         }


  58.         public function destroy ( $id ) {
  59.                 $key = 'session/'.$id;
  60.                 self::$engine->delete($key);
  61.                 session_write_close();
  62.         }

  63.         public function __destruct ( ) {
  64.                 session_write_close();
  65.         }


  66.         public function gc ( $maxlifetime ) {
  67.                 return true;
  68.         }


  69.         public function open ( $save_path , $session_name ) {
  70.                 return true;
  71.         }
  72. };
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-05-19 11:43 |只看该作者
自己已经处理了,把处理的结果分享给大家吧。
重点的变化在 destroy 方法
  1. <?php

  2. class CSessFile {

  3.         public function add( $key, $data, $cg_maxlifetime ) {
  4.                 $filepath = substr( $key, 7 );
  5.                 file_put_contents( SESSION_DIR.$filepath, $data );
  6.                 return true;
  7.         }

  8.         public function fetch( $key ) {
  9.                 $filepath = substr( $key, 7 );
  10.                 if ( !file_exists(SESSION_DIR.$filepath) ) {
  11.                         file_put_contents( SESSION_DIR.$filepath, '' );
  12.                         return true;
  13.                 }
  14.                 return file_get_contents( SESSION_DIR.$filepath );
  15.         }

  16.         public function delete( $key ) {
  17.                 $filepath = substr( $key, 7 );
  18.                 if ( file_exists( SESSION_DIR.$filepath ) ) {
  19.                         unlink( SESSION_DIR.$filepath );
  20.                 }
  21.                 return true;
  22.         }
  23. };




  24. class CSessAPC {

  25.         public function add( $key, $data, $cg_maxlifetime ) {
  26.                 apc_store( $key, $data, $cg_maxlifetime );
  27.                 return true;
  28.         }

  29.         public function fetch( $key ) {
  30.                 if ( !apc_exists( $key ) ) {
  31.                         apc_store( $key, '' );
  32.                         return true;
  33.                 }
  34.                 return apc_fetch( $key );
  35.         }

  36.         public function delete( $key ) {
  37.                 if ( apc_exists( $key ) ) {
  38.                         apc_delete( $key );
  39.                 }
  40.                 return true;
  41.         }
  42. };




  43. class CSession {

  44.         private static $engine;
  45.         private static $gc_maxlifetime;

  46.         public static function engine( $enginer ) {
  47.                 switch( $enginer ) {
  48.                         case 'apc':
  49.                                 $handler = new CSession( new CSessAPC() );
  50.                                 break;
  51.                        
  52.                         default:
  53.                                 $handler = new CSession( new CSessFile() );
  54.                                 break;
  55.                 }

  56.                 ini_set( "session.save_handler", "user" );
  57.                 ini_set( 'apc.ttl', 3600 );
  58.                 ini_set( 'apc.user_ttl', 1200 );
  59.                 ini_set( 'apc.gc_ttl', 3600 );

  60.                 session_set_save_handler(
  61.                         array($handler, 'open'),
  62.                         array($handler, 'close'),
  63.                         array($handler, 'read'),
  64.                         array($handler, 'write'),
  65.                         array($handler, 'destroy'),
  66.                         array($handler, 'gc')
  67.                 );
  68.         }

  69.         public function __construct( & $engine ) {
  70.                 self::$engine = $engine;
  71.                 self::$gc_maxlifetime = ini_get( 'session.gc_maxlifetime' );
  72.         }

  73.         public function read( $id ) {
  74.                 return self::$engine->fetch( 'session/'.$id );
  75.         }

  76.         public function write ( $id , $data ) {
  77.                 return self::$engine->add( 'session/'.$id, $data, self::$gc_maxlifetime );
  78.         }

  79.         public function close ( ) {
  80.                 return true;
  81.         }


  82.         public function destroy ( $id ) {
  83.                 return self::$engine->delete( 'session/'.$id );
  84.         }

  85.         public function __destruct ( ) {
  86.                 session_write_close();
  87.         }


  88.         public function gc ( $maxlifetime ) {
  89.                 return true;
  90.         }


  91.         public function open ( $save_path , $session_name ) {
  92.                 return true;
  93.         }
  94. };
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-05-29 10:32 |只看该作者
还真奇怪,有人把session放到apc。
php重启就over了。

论坛徽章:
0
4 [报告]
发表于 2012-05-29 18:52 |只看该作者
刚刚知道APC这项技术,不知道它是怎样来实现的cache 和优化的?

论坛徽章:
0
5 [报告]
发表于 2012-05-31 10:29 |只看该作者
一个字....强....
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP