HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > PHP
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Обьект уничтожается раньше времени
  #1  
Старый 16.05.2009, 11:39
Doom123
Постоянный
Регистрация: 11.11.2006
Сообщений: 834
С нами: 10262314

Репутация: 668


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

возникла проблема ... у меня есть класс для работы с сессиями через БД потом от нех делать рнешил сделать тоже самое но с использованием

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 но нет =\\


кто может обьеснить что тут произошло?

Последний раз редактировалось Doom123; 16.05.2009 в 11:47..
 
Ответить с цитированием

  #2  
Старый 16.05.2009, 12:33
Gifts
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
С нами: 9497186

Репутация: 1304


По умолчанию

Doom123, В мануале все написано, в общем-то

Цитата:
As of PHP 5.0.5 the write and close handlers are called after object destruction and therefore cannot use objects or throw exceptions. The object destructors can however use sessions.

It is possible to call session_write_close() from the destructor to solve this chicken and egg problem.
Плюс к этому комментарий:

Цитата:
If using mysqli in procedural style you may expect the mysqli handle to be valid in the write callback. It is not the case, the handle in procedural style is a object that will be destroy unlink the plain mysql interface handle. Just register a shutdown function after set save handler like this:

session_set_save_handler('_session_open', '_session_close', '_session_read', '_session_write', '_session_destroy', '_session_gc');
register_shutdown_function('session_write_close');
 
Ответить с цитированием

  #3  
Старый 16.05.2009, 12:46
Pashkela
Динозавр
Регистрация: 10.01.2008
Сообщений: 2,841
С нами: 9649706

Репутация: 3338


По умолчанию

Может из-за этого:

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

Прописать в самом начале
 
Ответить с цитированием

  #4  
Старый 16.05.2009, 13:01
Doom123
Постоянный
Регистрация: 11.11.2006
Сообщений: 834
С нами: 10262314

Репутация: 668


По умолчанию

Gifts значит вызов записи и закрытия происходят после уничтожения обьектов?
а насчёт session_write_close я так и не понел чтоб решить эту проблему можно вызвать из деструктора эту функцию?
 
Ответить с цитированием

  #5  
Старый 16.05.2009, 13:14
Doom123
Постоянный
Регистрация: 11.11.2006
Сообщений: 834
С нами: 10262314

Репутация: 668


По умолчанию

хех ... ппц )) вызвал ф-цию в деструкторе ... тож не работает но только теперь при выводе масива GLOBALS выводит

Код:
Array
 *RECURSION*
 
Ответить с цитированием

  #6  
Старый 16.05.2009, 13:41
Gifts
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
С нами: 9497186

Репутация: 1304


По умолчанию

Doom123 Функция session_write_close должна быть вызвана последней, или после всех операций с сессиями. Или можно зарегистрировать, чтобы функция вызывалась перед завершением скрипта, с помощью register_shutdown_function('session_write_close');

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Убийца iPod" от Microsoft поступил в продажу раньше времени KPOT_f!nd Мировые новости. Обсуждения. 1 13.11.2006 18:19



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.