public function getPeer() { if (!empty($this->_peer)) { return $this->_peer; } //先看能不能找到,不能找到就新建 //通过client_tag找 $peer = Peer::findOne(['seed_id' => $this->seed->seed_id, 'user_id' => Yii::$app->user->identity->getId(), 'client_tag' => $this->base64_peer_id]); if (empty($peer)) { //尝试用ipv4 + ipv6找 $peer = Peer::findOne(['seed_id' => $this->seed->seed_id, 'user_id' => Yii::$app->user->identity->getId(), 'ipv4_addr' => $this->ipv4, 'ipv4_port' => $this->ipv4port, 'ipv6_addr' => $this->ipv6, 'ipv6_port' => $this->ipv6port]); } //仍然没找到,新建条目 if (empty($peer)) { $peer = new Peer(); $peer->seed_id = $this->seed->seed_id; $peer->user_id = Yii::$app->user->identity->getId(); //这里不能保存,否则会导致触发器误判 } $peer->ipv4_addr = $this->ipv4; $peer->ipv4_port = $this->ipv4port; $peer->ipv6_addr = $this->ipv6; $peer->ipv6_port = $this->ipv6port; $peer->client_tag = $this->base64_peer_id; $peer->status = intval($this->left) == 0 ? 'Seeder' : 'Leecher'; $this->_peer = $peer; return $peer; }
public function actionAnnounce() { Yii::$app->response->headers->add("Content-Type", "text/plain"); Yii::trace(print_r(Yii::$app->request->get(), true)); $form = new QueryPeersForm(); $form->attributes = Yii::$app->request->get(); Yii::info($form->ip); $peer_list = null; if ($form->validate()) { $peer = $form->peer; $peer->real_up = $form->uploaded; $peer->real_down = $form->downloaded; if ($peer->user_id == $form->seed->publisher_user_id) { $peer->up_coef = 200; //做种者两倍上传 } $peer->save(); //处理event switch ($form->event) { case 'regular': break; case 'started': //do nothing? break; case 'stopped': $peer->delete(); break; case 'completed': $event = new SeedEvent(); $event->seed_id = $form->seed->seed_id; $event->user_id = Yii::$app->user->identity->getId(); $event->event_type = 'Completed'; $event->insert(); $form->seed->completed_count++; $form->seed->save(); break; default: Yii::warning("Unknown event", static::className()); } if ($form->numwant == 0) { $form->numwant = 100; } //Seeder会排到前面 $peer_list = Peer::find()->where(['seed_id' => $form->seed->seed_id])->orderBy(['status' => SORT_ASC, 'update_time' => SORT_DESC])->limit(min(300, intval($form->numwant)))->all(); } else { $errors = $form->errors; Yii::warning($errors); } return $this->renderPartial("queryPeerList", ['peer_list' => $peer_list, 'form' => $form]); }
public function actionDeleteStalePeer() { Peer::deleteAll("update_time <= now() - '1 hour'::interval"); }
/** * @return \yii\db\ActiveQuery */ public function getPeers() { return $this->hasMany(Peer::className(), ['seed_id' => 'seed_id']); }
/** * @return \yii\db\ActiveQuery */ public function getPeers() { return $this->hasMany(Peer::className(), ['lifecycle_id' => 'record_id']); }