/**
  * @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]);
         }
     }
 }
Пример #3
0
    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));