• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
استفاده از session در zf
#1
چگونه در zf از سیشن ها استفاده کنیم؟
مثلا برای ذخیره سیشن ها در دیتابیس منوال زند پیشنهاد کرده که کلاسی با مشخصات Zend_Auth_Storage_Interface ایجاد کنیم و توسط کد زیر در فایل bootstrap.php استفاده کنیم:
کد پی‌اچ‌پی:
$auth Zend_Auth::getInstance();
        
$auth->setStorage(new Default_sessionStorage()); 

ولی من نمی بینم رکوردی در جدول سیشن ها در دیتابیس ایجاد بکند!
لطفا راهنمایی کنید
  پاسخ
تشکر شده توسط :
#2
(۱۳۸۸ بهمن ۲۶, ۰۹:۴۴ ب.ظ)nasserghiasi نوشته: چگونه در zf از سیشن ها استفاده کنیم؟
مثلا برای ذخیره سیشن ها در دیتابیس منوال زند پیشنهاد کرده که کلاسی با مشخصات Zend_Auth_Storage_Interface ایجاد کنیم و توسط کد زیر در فایل bootstrap.php استفاده کنیم:
کد پی‌اچ‌پی:
$auth Zend_Auth::getInstance();
        
$auth->setStorage(new Default_sessionStorage()); 

ولی من نمی بینم رکوردی در جدول سیشن ها در دیتابیس ایجاد بکند!
لطفا راهنمایی کنید

شما دقیق سشن رو بخونید
اگر توی تنظیمات سشن زده باشید داخل دیتابیس ذخیره کرده باشه ذخیره می کنه. Default_sessionStorage رو چطور تعریف کردید؟ در ضمن لازم نیست که حتما یه کلاس تعریف کنید
  پاسخ
تشکر شده توسط :
#3
تا اینجا متوجه شدم باید از کد زیر استفاده کنم:
کد پی‌اچ‌پی:
$config = array(
        
'name'           => 'session_data',
        
'primary'        => 'ID',
        
'modifiedColumn' => 'modified',
        
'dataColumn'     => 'data',
        
'lifetimeColumn' => 'lifetime'
        
);
        
        
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
        
        
Zend_Session::start(); 

ضمنا من نمی تونم یه فیلد دیگه برای ذخیره در دیتابیس اضافه کنم؟ مثلا از http_user_agent یا memberID ؟
  پاسخ
تشکر شده توسط :
#4
میشه‌ ولی باید یه کلاس دیگه که از کلاس Zend_Session_SaveHandler_DbTable ارثبری شده بگیرید. شما کلاس Zend_Session_SaveHandler_DbTable رو مطابعه کنید می تونید بفهمید که چه طور می تونید یه save handler بسازید
  پاسخ
تشکر شده توسط : nasserghiasi
#5
ممنون
  پاسخ
تشکر شده توسط :
#6
من فکر می کردم این، سیشن های منقضی شده رو خودکار حذف می کنه!
این که افزونگی داده میاره!
خودش امکانشو داره یا من باید اینکارو بکنم؟
  پاسخ
تشکر شده توسط :
#7
من سشن با دیتابیس کار نکردم
باید جستجو کنید. ببینید به نتیجه می رسید اگر رسیدید اینجا هم اعلام کنید
  پاسخ
تشکر شده توسط :
#8
آقا من واسه خودم یه save handler ساختم ولی تابع write فراخوانی نمی شه! و اصلا تو دیتابیس ثبت نمی کنه
کد پی‌اچ‌پی:
<?php
class NAG_sessionStorage implements Zend_Session_SaveHandler_Interface
{
    protected 
$tableName;
    protected 
$db;
    protected 
$sessionLifetime;
    protected 
$_sessionSavePath;
    protected 
$_sessionName;
    
    
    public function 
__construct()
    {
        
$this->db Zend_Registry::get('db');
        
$this->config Zend_Registry::get("config");  
        
$this->sessionLifetime $this->config->session->gc_maxlifetime;
        
$this->gc_probability $this->config->session->gc_probability;
        
$this->gc_divisor $this->config->session->gc_divisor;
        
$this->tableName $this->config->session->database->tableName;
    }
    
    
/**
     * Destructor
     *
     * @return void
     */
    
public function __destruct()
    {
        
Zend_Session::writeClose();
    }
    
    public function 
getMember()
    {
        
// call the garbage collector
        
$this->gc($this->sessionLifetime);
        
// counts the rows from the database
        
$result $this->db->fetchRow("
            SELECT
                COUNT(ID) as count
            FROM " 
$this->tableName "

        "
);
        
// return the number of found rows
        
return $result["count"];
    }
    
    
/**
     * Open Session
     *
     * @param string $save_path
     * @param string $name
     * @return boolean
     */
    
public function open($save_path$name)
    {
        
$this->_sessionSavePath $save_path;
        
$this->_sessionName     $name;

        return 
true;
    }

    
    
/**
     * Read session data
     *
     * @param string $id
     * @return string
     */
    
public function read($id)
    {
        
        
$return '';

        
$result "SELECT *  FROM " $this->tableName " WHERE ID = " $this->db->quote($id) . " LIMIT 1;";
        
$rows $this->db->fetchRow($result);

        if (
count($rows)) {
            if ((
$rows['modified'] + $rows['lifetime'])   > time()) {
                
$return $rows['data'];
            } else {
                
$this->destroy($id);
            }
        }
        return 
$return;
    }

    
/**
     * Write session data
     *
     * @param string $id
     * @param string $data
     * @return boolean
     */
    
public function write($id$data)
    {
        
$return false;

        
$fields = array(
            
'ID' => $id 
            
'useragent' => $_SERVER["HTTP_USER_AGENT"] , 
            
'data'      => $data,
            
'lifetime' => $this->sessionLifetime 
            
'modified' => time());
        
        
$select $this->db->select();
        
$select->from($this->tableName);
        
$select->where('ID = '.$this->db->quote($id));
        
        
$rows $this->db->fetchRow($select); 

        if (
count($rows)) {

            if (
$this->db->update($this->tableName$fields'ID = '.$this->db->quote($id))) {
                
$return true;
            }
        } else {

            if (
$this->db->insert($this->tableName$fields)) {
                
$return true;
            }
        }

        return 
$return;
    }
    
    
    
/**
     * Close session
     *
     * @return boolean
     */
    
public function close()
    {
        return 
true;
    }
    
    
/**
     * Destroy session
     *
     * @param string $id
     * @return boolean
     */
    
public function destroy($id)
    {
        
$return false;

        if (
$this->db->delete($this->tableName,'ID = '.$this->db->quote($id))) {
            
$return true;
        }

        return 
$return;
    }

    
/**
     *  Custom gc() function (garbage collector)
     *
     *  @access private
     */
    
function gc($maxlifetime)
    {
        
// it deletes expired sessions from database 
        
$result $this->db->delete($this->tableName"modified < " $this->db->quote(time()));
    }

  پاسخ
تشکر شده توسط :
#9
http://devzone.zend.com/article/141
یه‌ نگاهی بهش بندازین
چه طوری از کدتون استفاده می کنین؟
  پاسخ
تشکر شده توسط : nasserghiasi
#10
اینطوری:
کد پی‌اچ‌پی:
    Zend_Session::setSaveHandler(new NAG_sessionStorage($config) );

        
Zend_Session::start();


        
// new instances
        
$session = new Zend_Session_Namespace('NAG');
        
Zend_Registry::set('session'$session);
        
$this->session $session
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان