/**
  *
  */
 public function testReadUserInfo()
 {
     if (extension_loaded('xdebug')) {
         $this->assertTrue(true);
         return;
     }
     $gameVersion = 'tw';
     $pool = PdoFactory::makePool($gameVersion);
     $shardIdList = ShardHelper::listShardId($gameVersion);
     $uidList = [474000, 474001, 474002];
     $userList = [];
     foreach ($shardIdList as $shardId) {
         $pdo = $pool->getByShardId($shardId);
         $generator = CommonInfoProvider::readUserInfo($pdo, $uidList, 1);
         foreach ($generator as $batchUserList) {
             array_walk($batchUserList, function (array $userInfo, $uid) use(&$userList) {
                 $userList[$uid] = $userInfo;
             });
         }
     }
     static::assertEquals($uidList, array_keys($userList));
     foreach ($userList as $user) {
         static::assertTrue(is_array($user));
         static::assertArrayHasKey('uid', $user);
         static::assertArrayHasKey('snsid', $user);
     }
 }
 /**
  *
  */
 public function testListShardId()
 {
     $shardIdList = ShardHelper::listShardId('tw');
     $keys = array_keys($shardIdList);
     $expectedKeys = range(0, count($shardIdList) - 1);
     static::assertEquals($expectedKeys, $keys);
     array_map(function ($shardId) {
         static::assertStringStartsWith('db', $shardId);
     }, $shardIdList);
 }
 /**
  *
  */
 public function test()
 {
     $gameVersion = self::$gameVersion;
     $shardIdList = ShardHelper::listShardId($gameVersion);
     $queue = new UidQueue(self::$dir, $gameVersion, $shardIdList);
     $groupedUidList = ['db1' => [1, 2, 3], 'db2' => [21, 22, 23]];
     $queue->push($groupedUidList);
     $content = $queue->pop();
     foreach ($groupedUidList as $shardId => $expectedUidList) {
         static::assertEquals($expectedUidList, $content[$shardId]);
     }
 }
 /**
  * SyncMachine constructor.
  *
  * @param string $gameVersion
  * @param string $esHost
  */
 public function __construct($gameVersion, $esHost)
 {
     $this->gameVersion = $gameVersion;
     $this->esHost = $esHost;
     $date = date('Ymd');
     $persist = new AggregatorPersist(LOG_DIR . '/' . $gameVersion . '.uid.persist');
     $this->aggregator = new UidAggregator($persist);
     $this->shardList = ShardHelper::listShardId($gameVersion);
     $this->logFile = LOG_DIR . '/' . $date . '/' . $gameVersion . '.machine';
     $this->prepareLogDir($this->logFile);
     $this->dataProvider = new UserDetailProvider($gameVersion, PdoFactory::makePool($gameVersion));
     $this->indexer = IndexerFactory::make($esHost, $gameVersion, self::FLUSH_MAGIC_NUMBER);
 }
if ($verbose) {
    $msg = sprintf('game version: %s, specifiedDate=%s, interval=%d, round=%d, start at: %s, quit at: %s', $gameVersion, $specifiedDate, $interval, $round, date('H:i:s'), date('H:i:s', $quitTimestamp));
    dump($msg);
}
$logFileGetter = function ($gameVersion, $date) {
    $logDate = str_replace('-', '', $date);
    $filePath = LOG_DIR . '/' . $logDate . '/' . $gameVersion . '.install';
    $dir = dirname($filePath);
    if (!is_dir($dir)) {
        mkdir($dir, 0755, true);
    }
    return $filePath;
};
$myself = basename(__FILE__);
$installUidProvider = new InstallUidProvider($gameVersion, PdoFactory::makePool($gameVersion));
$shardList = ShardHelper::listShardId($gameVersion);
$queue = new UidQueue(UID_QUEUE_DIR, $gameVersion, $shardList);
$stepGenerator = WorkRoundGenerator::generate($now, $quitTimestamp, $interval, false);
foreach ($stepGenerator as $timestamp) {
    $msg = $myself . ': ' . date('c', $timestamp) . ' run with ts ' . date('c', $timestamp);
    appendLog($msg);
    $date = $specifiedDate ? $specifiedDate : date('Y-m-d');
    $groupedUidList = $installUidProvider->generate($date, function ($shardId, $userCount, $delta) {
        if ($userCount === 0) {
            return;
        }
        appendLog(sprintf('%s install(%d) cost %s', $shardId, $userCount, PHP_Timer::secondsToTimeString($delta)));
    });
    $queue->push($groupedUidList);
    $deltaList = $installUidProvider->getDeltaList();
    $totalCount = 0;