function testSetLogger() { $server = new Server(); $logger = new MockLogger(); $server->setLogger($logger); $this->assertEquals($logger, $server->getLogger()); }
/** * Execute commands as console * * @param Server $server - pocketmine\Server instance * @param str[]|str $cmd - commands to execute * @param bool $show - show commands being executed */ public static function console($server, $cmd, $show = false) { if (!is_array($cmd)) { $cmd = [$cmd]; } foreach ($cmd as $c) { if ($show) { $server->getLogger()->info("CMD> {$cmd}"); } $server->dispatchCommand(new ConsoleCommandSender(), $c); } }
public function dumpServerMemory($outputFolder, $maxNesting, $maxStringSize) { gc_disable(); if (!file_exists($outputFolder)) { mkdir($outputFolder, 0777, true); } $this->server->getLogger()->notice("[Dump] After the memory dump is done, the server might crash"); $obData = fopen($outputFolder . "/objects.js", "wb+"); $staticProperties = []; $data = []; $objects = []; $refCounts = []; $this->continueDump($this->server, $data, $objects, $refCounts, 0, $maxNesting, $maxStringSize); do { $continue = false; foreach ($objects as $hash => $object) { if (!is_object($object)) { continue; } $continue = true; $className = get_class($object); $objects[$hash] = true; $reflection = new \ReflectionObject($object); $info = ["information" => "{$hash}@{$className}", "properties" => []]; if ($reflection->getParentClass()) { $info["parent"] = $reflection->getParentClass()->getName(); } if (count($reflection->getInterfaceNames()) > 0) { $info["implements"] = implode(", ", $reflection->getInterfaceNames()); } foreach ($reflection->getProperties() as $property) { if ($property->isStatic()) { continue; } if (!$property->isPublic()) { $property->setAccessible(true); } $this->continueDump($property->getValue($object), $info["properties"][$property->getName()], $objects, $refCounts, 0, $maxNesting, $maxStringSize); } fwrite($obData, "{$hash}@{$className}: " . json_encode($info, JSON_UNESCAPED_SLASHES) . "\n"); if (!isset($objects["staticProperties"][$className])) { $staticProperties[$className] = []; foreach ($reflection->getProperties() as $property) { if (!$property->isStatic() or $property->getDeclaringClass()->getName() !== $className) { continue; } if (!$property->isPublic()) { $property->setAccessible(true); } $this->continueDump($property->getValue($object), $staticProperties[$className][$property->getName()], $objects, $refCounts, 0, $maxNesting, $maxStringSize); } } } echo "[Dump] Wrote " . count($objects) . " objects\n"; } while ($continue); file_put_contents($outputFolder . "/staticProperties.js", json_encode($staticProperties, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); file_put_contents($outputFolder . "/serverEntry.js", json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); file_put_contents($outputFolder . "/referenceCounts.js", json_encode($refCounts, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); echo "[Dump] Finished!\n"; gc_enable(); $this->server->forceShutdown(); }