1

我有我的网络套接字服务器,其中包含一个包含导入对象的用户数组。

我想在导入对象的某些方法调用期间向用户发送更新。

我想这样做我需要将服务器和用户的引用传递给我的 Import 对象,但是,我担心由于我的用户和 import 对象之间的递归引用,这些 to 永远不会去当我从 Web 套接字中包含的用户列表中取消设置用户时,垃圾并导致内存泄漏。

我在每个对象上添加了一个__destruct方法来检查我的对象何时被破坏。

class importServer extends WebSocketServer {

function __construct($addr, $port) { //set buffersize to 1M => 1048576
    parent::__construct($addr, $port, 1048576);
    $this->userClass = 'ImportUser';
}

protected function process ($user, $rawData) {
    $this->send($user, "start processing data!");
    if($data = json_decode($rawData, true)){
        // check data length is as expected
        if($this->check_data($data)){
            if($workbooks = json_decode($data, true)){
                foreach($workbooks as $workbook){
                    // Creating new import object for each worbook received
                    $obj = new import($workbook);
                    // check workbook data
                    $result = $obj->preprocessing();

                    if($result === true){
                        $this->send($user, "Preprocessing successfully completed!");
                        // User store import object for later import in DB
                        $user->imports[] = $obj;
                    }else{
                        $this->throw_error($user, $result);
                    }

断开连接时取消设置用户的 Web 套接字方法:

protected function disconnect($socket, $triggerClosed = true, $sockErrNo = null)
{
    $disconnectedUser = $this->getUserBySocket($socket);

    if ($disconnectedUser !== null) {
        unset($this->users[$disconnectedUser->id]);


        if (array_key_exists($disconnectedUser->id, $this->sockets)) {
            unset($this->sockets[$disconnectedUser->id]);
        }

        if (!is_null($sockErrNo)) {
            socket_clear_error($socket);
        }
        if ($triggerClosed) {
            $this->stdout("Client disconnected. " . $disconnectedUser->socket);
            $this->closed($disconnectedUser);
            socket_close($disconnectedUser->socket);
        } else {
            $message = $this->frame('', $disconnectedUser, 'close');
            @socket_write($disconnectedUser->socket, $message, strlen($message));
        }
    }
}

销毁方法:

public function __destruct(){
    echo __CLASS__ . " destruction";
}

用户对象在调用 unset 时不会被破坏,但是当新用户连接到 Web 套接字时,对于被破坏用户中包含的导入对象,即使我删除了递归引用,它也不会被破坏。

控制台图像

当用户对象被销毁时,我希望我的导入对象被销毁。

4

0 回答 0