| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- <?php
- /**
- * Created by PhpStorm.
- * User: liang
- * Date: 2020/2/18
- * Time: 6:36 PM
- */
- namespace console\controllers;
- use common\models\UserInfo;
- use common\models\UserNetwork;
- use common\models\UserRelation;
- class FixNetController extends BaseController {
- const LIMIT = 1000;
- //顶点ID列表
- const TOP_ID_LIST = [
- '670B84FD7C216D4EE055736AECE8644D',
- '80552117701578757',
- ];
- //PARENT_UIDS缓存键
- const FIX_NET_CACHE_NETWORK_PARENT_UIDS_KEY = 'fixNet:cache:network:parentUids:key';
- const FIX_NET_CACHE_RELATION_PARENT_UIDS_KEY = 'fixNet:cache:relation:parentUids:key';
- const FIX_RELATION_DEEP_DEEP_USER_ID_KEY = 'fixRelationDeepDeepUserIdKey_%d';
- /**
- * 清空缓存
- */
- public function actionClearCache() {
- $this->_clearNetworkParentUidsCache();
- $this->_clearRelationParentUidsCache();
- echo '缓存清理成功' . PHP_EOL;
- }
- /**
- * 安置数据
- * @param int $startPage
- * @throws \yii\db\Exception
- */
- public function actionNetwork($startPage=1) {
- $allCount = UserNetwork::find()->where('1=1')->orderBy('TOP_DEEP ASC,ID ASC')->count('ID');
- $limit = self::LIMIT;
- $pageCount = ceil($allCount/$limit);
- unset($allCount);
- for($page=$startPage;$page<=$pageCount;$page++) {
- $userList = UserNetwork::find()->where('1=1')->orderBy('TOP_DEEP ASC,ID ASC')->limit($limit)->offset(($page-1)*$limit)->asArray()->all();
- foreach ($userList as $everyUser) {
- //顶点不处理
- if( $everyUser['PARENT_UID'] == 0 ) continue;
- $parentUidsCacheStr = $this->_getNetworkParentUidsCache($everyUser['PARENT_UID']);
- if( $parentUidsCacheStr ) {
- $parentUidsStr = $parentUidsCacheStr . ',' . $everyUser['PARENT_UID'];
- }else {
- if( $everyUser['TOP_DEEP'] == 1 ) {
- $parentUidsStr = $everyUser['PARENT_UID'];
- }else {
- echo sprintf('parentUids错误 userId:%s,parentUid:%s'.PHP_EOL, $everyUser['USER_ID'], $everyUser['PARENT_UID']);
- continue;
- }
- }
- $this->_addNetworkParentUidsCache($everyUser['USER_ID'], $parentUidsStr);
- if( $parentUidsStr != $everyUser['PARENT_UIDS'] ) {
- UserNetwork::updateAll(['PARENT_UIDS'=>$parentUidsStr], 'ID=:ID', ['ID'=>$everyUser['ID']]);
- echo sprintf('parentUids成功 userId:%s,parentUid:%s'.PHP_EOL, $everyUser['USER_ID'], $everyUser['PARENT_UID']);
- }
- unset($everyUser, $parentUidsCacheStr, $parentUidsStr);
- }
- unset($userList);
- echo sprintf("更新网体表数据,总页数【%s】,当前页数:【%s】更新成功".PHP_EOL, $pageCount, $page);
- }
- echo '更新网体表数据全部完成' . PHP_EOL;
- }
- /**
- * 跑关系表中所有的深度
- * @param int $deep
- */
- public function actionRelationTopDeep($deep=1) {
- if( $deep === 1 ) $this->_cacheOneDeepInit();
- //取deep的列表
- $status = $this->_calcOneDeepList($deep);
- if( $status ) $this->actionRelationTopDeep($deep+1);
- }
- /**
- * 初始化0层的缓存
- */
- private function _cacheOneDeepInit() {
- foreach (self::TOP_ID_LIST as $userId) {
- self::_addRelationDeepUserIdCache(0, $userId);
- }
- }
- /**
- * 计算某一层深度的列表
- * @param $deep
- * @param int $offset
- * @return bool
- */
- private function _calcOneDeepList($deep, $offset=0) {
- echo sprintf("时间:[%s]推荐深度,当前deep为:【%d】,当前offset为:【%d】" . PHP_EOL, date('Y-m-d H:i:s', time()) , $deep, $offset);
- $allData = self::_getRelationDeepList($deep-1, $offset, self::LIMIT);
- if( $allData ) {
- foreach ($allData as $userId) {
- $childrenList = UserRelation::find()->where('PARENT_UID=:PARENT_UID', ['PARENT_UID'=>$userId])->asArray()->all();
- foreach ($childrenList as $childData) {
- if( $childData['TOP_DEEP'] != $deep ) {
- UserRelation::updateAll([
- 'TOP_DEEP' => $deep,
- ], 'USER_ID=:USER_ID', ['USER_ID'=>$childData['USER_ID']]);
- UserInfo::updateAll(['RELATION_DEEP'=>$deep], 'USER_ID=:USER_ID', ['USER_ID'=>$childData['USER_ID']]);
- }
- if( !in_array($childData['TOP_UID'], self::TOP_ID_LIST) ) {
- if( in_array($userId, self::TOP_ID_LIST) ) {
- UserRelation::updateAll([
- 'TOP_UID' => $userId,
- ], 'USER_ID=:USER_ID', ['USER_ID'=>$childData['USER_ID']]);
- }else {
- $parentData = UserRelation::find()->where('USER_ID=:USER_ID', ['USER_ID'=>$userId])->asArray()->one();
- UserRelation::updateAll([
- 'TOP_UID' => $parentData['TOP_UID'],
- ], 'USER_ID=:USER_ID', ['USER_ID'=>$childData['USER_ID']]);
- unset($parentData);
- }
- }
- self::_addRelationDeepUserIdCache($deep, $childData['USER_ID']);
- }
- }
- return $this->_calcOneDeepList($deep, $offset + self::LIMIT);
- }
- unset($allData);
- $this->_clearRelationDeepUserIdCache($deep-1);
- if( $offset > 0 ) {
- return true;
- }else {
- return false;
- }
- }
- /**
- * 推荐数据
- * @param int $startPage
- * @throws \yii\db\Exception
- */
- public function actionRelation($startPage=1) {
- $allCount = UserRelation::find()->where('1=1')->orderBy('TOP_DEEP ASC,ID ASC')->count('ID');
- $limit = self::LIMIT;
- $pageCount = ceil($allCount/$limit);
- unset($allCount);
- for($page=$startPage;$page<=$pageCount;$page++) {
- $userList = UserRelation::find()->where('1=1')->orderBy('TOP_DEEP ASC,ID ASC')->limit($limit)->offset(($page-1)*$limit)->asArray()->all();
- foreach ($userList as $everyUser) {
- //顶点不处理
- if( $everyUser['PARENT_UID'] == 0 ) continue;
- $parentUidsCacheStr = $this->_getRelationParentUidsCache($everyUser['PARENT_UID']);
- if( $parentUidsCacheStr ) {
- $parentUidsStr = $parentUidsCacheStr . ',' . $everyUser['PARENT_UID'];
- }else {
- if( $everyUser['TOP_DEEP'] == 1 ) {
- $parentUidsStr = $everyUser['PARENT_UID'];
- }else {
- echo sprintf('parentUids错误 userId:%s,parentUid:%s'.PHP_EOL, $everyUser['USER_ID'], $everyUser['PARENT_UID']);
- continue;
- }
- }
- $this->_addRelationParentUidsCache($everyUser['USER_ID'], $parentUidsStr);
- if( $parentUidsStr != $everyUser['PARENT_UIDS'] ) {
- UserRelation::updateAll(['PARENT_UIDS'=>$parentUidsStr], 'ID=:ID', ['ID'=>$everyUser['ID']]);
- echo sprintf('parentUids成功 userId:%s,parentUid:%s'.PHP_EOL, $everyUser['USER_ID'], $everyUser['PARENT_UID']);
- }
- unset($everyUser, $parentUidsCacheStr, $parentUidsStr);
- }
- unset($userList);
- echo sprintf("更新推荐表数据,总页数【%s】,当前页数:【%s】更新成功".PHP_EOL, $pageCount, $page);
- }
- echo '更新推荐表数据全部完成' . PHP_EOL;
- }
- /**
- * 添加parent_uids Cache数据
- * @param $userId
- * @param $parentUidsStr
- * @return mixed
- */
- private function _addNetworkParentUidsCache($userId, $parentUidsStr) {
- return \Yii::$app->redis->hSet(self::FIX_NET_CACHE_NETWORK_PARENT_UIDS_KEY, $userId, $parentUidsStr);
- }
- /**
- * 获取parent_uids Cache数据
- * @param $userId
- * @return mixed
- */
- private function _getNetworkParentUidsCache($userId) {
- return \Yii::$app->redis->hGet(self::FIX_NET_CACHE_NETWORK_PARENT_UIDS_KEY, $userId);
- }
- /**
- * 清空parent_uids Cache数据
- * @return mixed
- */
- private function _clearNetworkParentUidsCache() {
- return \Yii::$app->redis->del(self::FIX_NET_CACHE_NETWORK_PARENT_UIDS_KEY);
- }
- /**
- * 添加parent_uids Cache数据
- * @param $userId
- * @param $parentUidsStr
- * @return mixed
- */
- private function _addRelationParentUidsCache($userId, $parentUidsStr) {
- return \Yii::$app->redis->hSet(self::FIX_NET_CACHE_RELATION_PARENT_UIDS_KEY, $userId, $parentUidsStr);
- }
- /**
- * 获取parent_uids Cache数据
- * @param $userId
- * @return mixed
- */
- private function _getRelationParentUidsCache($userId) {
- return \Yii::$app->redis->hGet(self::FIX_NET_CACHE_RELATION_PARENT_UIDS_KEY, $userId);
- }
- /**
- * 清空parent_uids Cache数据
- * @return mixed
- */
- private function _clearRelationParentUidsCache() {
- return \Yii::$app->redis->del(self::FIX_NET_CACHE_RELATION_PARENT_UIDS_KEY);
- }
- private function _clearRelationDeepUserIdCache($deep) {
- $key = sprintf(self::FIX_RELATION_DEEP_DEEP_USER_ID_KEY, $deep);
- return \Yii::$app->redis->del($key);
- }
- private function _addRelationDeepUserIdCache($deep, $userId) {
- $key = sprintf(self::FIX_RELATION_DEEP_DEEP_USER_ID_KEY, $deep);
- return \Yii::$app->redis->rpush($key, $userId);
- }
- private function _getRelationDeepList($deep, $offset = 0, $limit = 1000) {
- $key = sprintf(self::FIX_RELATION_DEEP_DEEP_USER_ID_KEY, $deep);
- return \Yii::$app->redis->lrange($key, $offset, ($offset + $limit - 1));
- }
- }
|