Обьект уничтожается раньше времени

Discussion in 'PHP' started by Doom123, 16 May 2009.

  1. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    возникла проблема ... у меня есть класс для работы с сессиями через БД потом от нех делать рнешил сделать тоже самое но с использованием

    session_set_save_handler

    вот что я делаю ..

    PHP:
    <?php

    //Различные функции
    require_once ('includes/func.php');
    //Файл конфигурации\\
    require_once ('includes/config.php');

    $a 'aa';

    function 
    ses_open($save_path,$ses_name) {
        return 
    true;    }
    function 
    ses_close() {    return true;    }

    function 
    ses_read($key
    {
        global 
    $db;
        
    $res $db->mysql_qw('SELECT `val` FROM `session` WHERE `key`=?',$key) or die();
        
    $fetch $db->mysql_fetch($res);
        
        return 
    $fetch['val'];
    }

    function 
    ses_write($key,$val
    {
        global 
    $db;

        
    $db->mysql_qw('REPLACE INTO `session` SET `val`=?,`key`=?',$val,$key) or die();

        return 
    true;
    }

    function 
    ses_destroy($key)
    {
        global 
    $db;
        
    $db->mysql_qw('DELETE FROM `session` WHERE `key` = ?',$key) or die();
        return 
    true;
    }

    function 
    ses_gc($maxlifetime)
    {
        global 
    $db;
        
    $time time() - $maxlifetime;
        
    $db->mysql_qw('DELETE FROM `session` WHERE UNIX_TIMESTAMP(`time`) <= ?',$time) or die();
        return 
    true;
    }


    session_set_save_handler("ses_open","ses_close","ses_read","ses_write","ses_destroy","ses_gc");




    session_start();

    $_SESSION['test'] =  1;

    ?>
    Выводит ошибку

    Fatal error: Call to a member function mysql_qw() on a non-object in test.php on line 29

    Я сделал вывод массива $GLOBALS в ф-ции ses_read и ses_write

    И удивился когда обьект $db существует в ses_read

    а в ses_write он уже уничтожен ... думал изза
    __destruct() в классе mysql но нет =\\


    кто может обьеснить что тут произошло?
     
    #1 Doom123, 16 May 2009
    Last edited: 16 May 2009
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Doom123, В мануале все написано, в общем-то

    Плюс к этому комментарий:

     
    _________________________
    1 person likes this.
  3. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Может из-за этого:

    session_write_close(); //cancel the session's auto start,important

    Прописать в самом начале
     
  4. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    Gifts значит вызов записи и закрытия происходят после уничтожения обьектов?
    а насчёт session_write_close я так и не понел чтоб решить эту проблему можно вызвать из деструктора эту функцию?
     
  5. Doom123

    Doom123 Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    749
    Likes Received:
    244
    Reputations:
    22
    хех ... ппц )) вызвал ф-цию в деструкторе ... тож не работает но только теперь при выводе масива GLOBALS выводит

    Code:
    Array
     *RECURSION*
    
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Doom123 Функция session_write_close должна быть вызвана последней, или после всех операций с сессиями. Или можно зарегистрировать, чтобы функция вызывалась перед завершением скрипта, с помощью register_shutdown_function('session_write_close');

    Если же просто ждать когда сработает session_set_save_handler то все объекты будут уже разрушены.
     
    _________________________