1

I have my web socket server, which contain an array of users which contain imports objects.

I want to send updates to the user during some methods calls on the import object.

I figured that to do so I would need to pass a reference of the server and user to my Import object, however, I'm afraid that due to the recursive reference between my user and the import object, these to would never go to the garbage and cause a memory leak when I unset the user from my list of users contained in the web socket.

I added on each object a __destruct methods to check when my objects are destructed.

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 socket method to to unset user when disconnected:

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));
        }
    }
}

Destruct method:

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

The user object is not destructed on the call of unset but when a new user connect to the web socket, as for the import object contained in the destructed user, it is not destructed even when I removed the recursive reference.

console img

I expected my imports objects to be destroyed when the user object is destroyed.

0 Answers0