Я пытаюсь написать скрипт демона.
Демон будет запускатся из командной строки на сервере.
Программа клиент пишется на FlashMX.
Допустим класс Client будет инкапсулировать все все данные о поключенных клиентах.
Приходит новый клиент создается новый объект Client, и записывается я в глобальном массиве $pool
PHP:
if (($msg = socket_accept($MasterSock))) {
$pool['вася'] = new clClient($msg);
}
.............
//обрабатываем всех клиентов
foraech($pool as $key=>$value){
$pool[$key]->run();
}
кроме того в зависимости от деиствий конкретного клиента он может быть зарегистрирован еще в нескольких процессах происходящих на сервере
PHP:
$chat['вася']=$pool['вася'];
$process1['вася']=$pool['вася'];
$process2['вася']=$pool['вася'];
Затем клиент Вася разрывает соединение и идет спать. На сервере соответствующий объект класса Client обнаруживет, что связь разорванна и должен сам себя полностью удалить , чтобы освободить память.
В PHP, как известно, объект будет удален в том случае, если на него нет ни одной ссылки.
Вначале я пытался сделать так:
PHP:
class Client{
var Name;
..........
function run(){
if(соединение разорванно){
global $pool;
unset($pool[$this->Name]);
unset($this);
}
}
}
однако на этотт объект остаются ссылки в массивах $chat, $process1, $process2, и естественно он будет продолжать висеть в памяти.
Заранее неизвестно в каких процессах будет участвовать клиент, более того количество таких процессов на сервере также неизвестно, оно постоянно меняется. Т.е. количетво мест где товарищь Вася мог оставить ссылки на сомого cебя неизвестно.
Вот вам и задача: написать такой метод для класса Client что бы он начисто удалял все ссылки на самого себя (так чтобы произошел вызов __destruct() всамом объекте).
Думаю задача ясна.
Не хотелось бы все это делать програмным методом (реализовывать контроль ссылок в классе Client и т.д. )
Может быть есть какие-то внутренние функции в PHP5? Я ничего найти не смог :-(
PS Товарищам не ознакомившимся с Zend Engine2 просьба сюда не писать.