我有我的网络套接字服务器,其中包含一个包含导入对象的用户数组。
我想在导入对象的某些方法调用期间向用户发送更新。
我想这样做我需要将服务器和用户的引用传递给我的 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 套接字时,对于被破坏用户中包含的导入对象,即使我删除了递归引用,它也不会被破坏。
当用户对象被销毁时,我希望我的导入对象被销毁。