예제 #1
0
 public function execute(CommandSender $sender, $currentAlias, array $args)
 {
     if (!$this->testPermission($sender)) {
         return true;
     }
     $rUsage = Utils::getRealMemoryUsage();
     $mUsage = Utils::getMemoryUsage(true);
     $server = $sender->getServer();
     $sender->sendMessage(TextFormat::GREEN . "---- " . TextFormat::WHITE . "%BukkitPE.command.status.title" . TextFormat::GREEN . " ----");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.player" . TextFormat::GREEN . \count($sender->getServer()->getOnlinePlayers()) . "/" . $sender->getServer()->getMaxPlayers());
     $time = microtime(true) - \BukkitPE\START_TIME;
     $seconds = floor($time % 60);
     $minutes = null;
     $hours = null;
     $days = null;
     if ($time >= 60) {
         $minutes = floor($time % 3600 / 60);
         if ($time >= 3600) {
             $hours = floor($time % (3600 * 24) / 3600);
             if ($time >= 3600 * 24) {
                 $days = floor($time / (3600 * 24));
             }
         }
     }
     $uptime = ($minutes !== null ? ($hours !== null ? ($days !== null ? "{$days} %BukkitPE.command.status.days " : "") . "{$hours} %BukkitPE.command.status.hours " : "") . "{$minutes} %BukkitPE.command.status.minutes " : "") . "{$seconds} %BukkitPE.command.status.seconds";
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.uptime " . TextFormat::RED . $uptime);
     $tpsColor = TextFormat::GREEN;
     if ($server->getTicksPerSecondAverage() < 10) {
         $tpsColor = TextFormat::GOLD;
     } elseif ($server->getTicksPerSecondAverage() < 1) {
         $tpsColor = TextFormat::RED;
     }
     $tpsColour = TextFormat::GREEN;
     if ($server->getTicksPerSecond() < 10) {
         $tpsColour = TextFormat::GOLD;
     } elseif ($server->getTicksPerSecond() < 1) {
         $tpsColour = TextFormat::RED;
     }
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.AverageTPS " . $tpsColor . $server->getTicksPerSecondAverage() . " (" . $server->getTickUsageAverage() . "%)");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.CurrentTPS " . $tpsColour . $server->getTicksPerSecond() . " (" . $server->getTickUsage() . "%)");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Networkupload " . TextFormat::RED . \round($server->getNetwork()->getUpload() / 1024, 2) . " kB/s");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Networkdownload " . TextFormat::RED . \round($server->getNetwork()->getDownload() / 1024, 2) . " kB/s");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Threadcount " . TextFormat::RED . Utils::getThreadCount());
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Mainmemory " . TextFormat::RED . number_format(round($mUsage[0] / 1024 / 1024, 2)) . " MB.");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Totalmemory " . TextFormat::RED . number_format(round($mUsage[1] / 1024 / 1024, 2)) . " MB.");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Totalvirtualmemory " . TextFormat::RED . number_format(round($mUsage[2] / 1024 / 1024, 2)) . " MB.");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Heapmemory " . TextFormat::RED . number_format(round($rUsage[0] / 1024 / 1024, 2)) . " MB.");
     $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Maxmemorysystem " . TextFormat::RED . number_format(round($mUsage[2] / 1024 / 1024, 2)) . " MB.");
     if ($server->getProperty("memory.global-limit") > 0) {
         $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.Maxmemorymanager " . TextFormat::RED . number_format(round($server->getProperty("memory.global-limit"), 2)) . " MB.");
     }
     foreach ($server->getLevels() as $level) {
         $sender->sendMessage(TextFormat::GOLD . "%BukkitPE.command.status.World \"" . $level->getFolderName() . "\"" . ($level->getFolderName() !== $level->getName() ? " (" . $level->getName() . ")" : "") . ": " . TextFormat::RED . number_format(count($level->getChunks())) . TextFormat::GREEN . " %BukkitPE.command.status.chunks " . TextFormat::RED . number_format(count($level->getEntities())) . TextFormat::GREEN . " %BukkitPE.command.status.entities " . TextFormat::RED . number_format(count($level->getTiles())) . TextFormat::GREEN . " %BukkitPE.command.status.tiles " . "%BukkitPE.command.status.Time " . (($level->getTickRate() > 1 or $level->getTickRateTime() > 40) ? TextFormat::RED : TextFormat::YELLOW) . round($level->getTickRateTime(), 2) . "%BukkitPE.command.status.ms" . ($level->getTickRate() > 1 ? " (tick rate " . $level->getTickRate() . ")" : ""));
     }
     return true;
 }
예제 #2
0
 public function __construct(Server $server, $type, $playerList = [])
 {
     $endpoint = "http://" . $server->getProperty("anonymous-statistics.host", "stats.BukkitPE.net") . "/";
     $data = [];
     $data["uniqueServerId"] = $server->getServerUniqueId()->toString();
     $data["uniqueMachineId"] = Utils::getMachineUniqueId()->toString();
     $data["uniqueRequestId"] = UUID::fromData($server->getServerUniqueId(), microtime(true))->toString();
     switch ($type) {
         case self::TYPE_OPEN:
             $data["event"] = "open";
             $version = new VersionString();
             $data["server"] = ["port" => $server->getPort(), "software" => $server->getName(), "fullVersion" => $version->get(true), "version" => $version->get(), "build" => $version->getBuild(), "api" => $server->getApiVersion(), "minecraftVersion" => $server->getVersion(), "protocol" => Info::CURRENT_PROTOCOL];
             $data["system"] = ["operatingSystem" => Utils::getOS(), "cores" => Utils::getCoreCount(), "phpVersion" => PHP_VERSION, "machine" => php_uname("a"), "release" => php_uname("r"), "platform" => php_uname("i")];
             $data["players"] = ["count" => 0, "limit" => $server->getMaxPlayers()];
             $plugins = [];
             foreach ($server->getPluginManager()->getPlugins() as $p) {
                 $d = $p->getDescription();
                 $plugins[$d->getName()] = ["name" => $d->getName(), "version" => $d->getVersion(), "enabled" => $p->isEnabled()];
             }
             $data["plugins"] = $plugins;
             break;
         case self::TYPE_STATUS:
             $data["event"] = "status";
             $data["server"] = ["ticksPerSecond" => $server->getTicksPerSecondAverage(), "tickUsage" => $server->getTickUsageAverage(), "ticks" => $server->getTick()];
             //This anonymizes the user ids so they cannot be reversed to the original
             foreach ($playerList as $k => $v) {
                 $playerList[$k] = md5($v);
             }
             $players = [];
             foreach ($server->getOnlinePlayers() as $p) {
                 if ($p->isOnline()) {
                     $players[] = md5($p->getUniqueId()->toBinary());
                 }
             }
             $data["players"] = ["count" => count($players), "limit" => $server->getMaxPlayers(), "currentList" => $players, "historyList" => array_values($playerList)];
             $info = Utils::getMemoryUsage(true);
             $data["system"] = ["mainMemory" => $info[0], "totalMemory" => $info[1], "availableMemory" => $info[2], "threadCount" => Utils::getThreadCount()];
             break;
         case self::TYPE_CLOSE:
             $data["event"] = "close";
             $data["crashing"] = $server->isRunning();
             break;
     }
     $this->endpoint = $endpoint . "api/post";
     $this->data = json_encode($data);
 }
예제 #3
0
 /**
  * Amount of memory already freed
  *
  * @return int
  */
 public function getMemoryFreed()
 {
     return $this->getMemory() - ($this->isGlobal() ? Utils::getMemoryUsage(true)[1] : Utils::getMemoryUsage(true)[0]);
 }
예제 #4
0
 public function check()
 {
     Timings::$memoryManagerTimer->startTiming();
     if (($this->memoryLimit > 0 or $this->globalMemoryLimit > 0) and ++$this->checkTicker >= $this->checkRate) {
         $this->checkTicker = 0;
         $memory = Utils::getMemoryUsage(true);
         $trigger = false;
         if ($this->memoryLimit > 0 and $memory[0] > $this->memoryLimit) {
             $trigger = 0;
         } elseif ($this->globalMemoryLimit > 0 and $memory[1] > $this->globalMemoryLimit) {
             $trigger = 1;
         }
         if ($trigger !== false) {
             if ($this->lowMemory and $this->continuousTrigger) {
                 if (++$this->continuousTriggerTicker >= $this->continuousTriggerRate) {
                     $this->continuousTriggerTicker = 0;
                     $this->trigger($memory[$trigger], $this->memoryLimit, $trigger > 0, ++$this->continuousTriggerCount);
                 }
             } else {
                 $this->lowMemory = true;
                 $this->continuousTriggerCount = 0;
                 $this->trigger($memory[$trigger], $this->memoryLimit, $trigger > 0);
             }
         } else {
             $this->lowMemory = false;
         }
     }
     if ($this->garbageCollectionPeriod > 0 and ++$this->garbageCollectionTicker >= $this->garbageCollectionPeriod) {
         $this->garbageCollectionTicker = 0;
         $this->triggerGarbageCollector();
     }
     Timings::$memoryManagerTimer->stopTiming();
 }