/** * @param PDO $pdo * @param array $uidList * @param int $concurrentLevel * @param string $columns * * @return \Generator */ public static function readUserInfo(PDO $pdo, array $uidList, $concurrentLevel = 100, $columns = '*') { $queryHelper = QueryHelperFactory::make($pdo); $removedUidSnsidPairs = $queryHelper->listUninstalledUid(); while ($batch = array_splice($uidList, 0, $concurrentLevel)) { $dataSet = $queryHelper->readUserInfo($batch, $removedUidSnsidPairs, $columns); (yield $dataSet); } }
/** * @param array $groupedUidList * * @return \Generator */ public function generate(array $groupedUidList) { foreach ($groupedUidList as $shardId => $shardUidList) { $pdo = $this->pdoPool->getByShardId($shardId); if ($pdo === false) { continue; } $batchReader = CommonInfoProvider::readUserInfo($pdo, $shardUidList, 500); foreach ($batchReader as $batchUserList) { $dataSet = $this->appendPaymentDigest($batchUserList); $uidLocalePairs = QueryHelperFactory::make($pdo)->listLocale(array_keys($batchUserList)); foreach ($uidLocalePairs as $uid => $locale) { $dataSet[$uid]['language'] = $locale; } (yield ['shardId' => $shardId, 'dataSet' => $dataSet]); } } }
if (!is_dir($dir)) { mkdir($dir, 0755, true); } return $filePath; }; $pdoPool = PdoFactory::makePool($gameVersion); $elasticaHelper = new ElasticaHelper($gameVersion, ELASTIC_SEARCH_INDEX, $magicNumber); $elasticaHelper->setVerbose($verbose); $localeCount = 0; $processedCount = 0; QueryHelperFactory::setVerbose($verbose); $userDetailProvider = new \DataProvider\User\UserDetailProvider($gameVersion, $pdoPool); $shardIdList = $pdoPool->listShardId(); foreach ($shardIdList as $shardId) { $pdo = $pdoPool->getByShardId($shardId); $queryHelper = QueryHelperFactory::make($pdo); PHP_Timer::start(); $uidLocalePairs = $queryHelper->listLocale(); $localeCount += count($uidLocalePairs); appendLog(sprintf('%s have %d locale users cost %s', $shardId, count($uidLocalePairs), PHP_Timer::secondsToTimeString(PHP_Timer::stop()))); file_put_contents(call_user_func($logFileGetter, $gameVersion, $shardId), print_r($uidLocalePairs, true)); $userDetailGenerator = $userDetailProvider->generate([$shardId => array_keys($uidLocalePairs)]); foreach ($userDetailGenerator as $payload) { $userInfoList = $payload['dataSet']; $syncCount = count($userInfoList); $processedCount += $syncCount; appendLog(sprintf('read user info get %d users cost %s', $syncCount, PHP_Timer::resourceUsage())); PHP_Timer::start(); $elasticaHelper->update($userInfoList, function ($snsidList) { appendLog(sprintf('Total %d user sync failed', count($snsidList))); appendLog('failed snsid: ' . implode(',', $snsidList));