Здравствуйте, подскажите пожалуйста, как вывести данные вот этих функций на экран print_r'ом ? Код (Text): <?php class MinecraftQueryException extends Exception { // Exception thrown by MinecraftQuery class } class MinecraftQuery { /* * Class written by xPaw * * Website: http://xpaw.ru * GitHub: https://github.com/xPaw/PHP-Minecraft-Query */ const STATISTIC = 0x00; const HANDSHAKE = 0x09; private $Socket; private $Players; private $Info; public function Connect( $Ip, $Port = 25565, $Timeout = 3 ) { if( !is_int( $Timeout ) || $Timeout < 0 ) { throw new InvalidArgumentException( 'Timeout must be an integer.' ); } $this->Socket = @FSockOpen( 'udp://' . $Ip, (int)$Port, $ErrNo, $ErrStr, $Timeout ); if( $ErrNo || $this->Socket === false ) { throw new MinecraftQueryException( 'Could not create socket: ' . $ErrStr ); } Stream_Set_Timeout( $this->Socket, $Timeout ); Stream_Set_Blocking( $this->Socket, true ); try { $Challenge = $this->GetChallenge( ); $this->GetStatus( $Challenge ); } // We catch this because we want to close the socket, not very elegant catch( MinecraftQueryException $e ) { FClose( $this->Socket ); throw new MinecraftQueryException( $e->getMessage( ) ); } FClose( $this->Socket ); } public function GetInfo( ) { return isset( $this->Info ) ? $this->Info : false; } public function GetPlayers( ) { return isset( $this->Players ) ? $this->Players : false; } private function GetChallenge( ) { $Data = $this->WriteData( self :: HANDSHAKE ); if( $Data === false ) { throw new MinecraftQueryException( "Failed to receive challenge." ); } return Pack( 'N', $Data ); } private function GetStatus( $Challenge ) { $Data = $this->WriteData( self :: STATISTIC, $Challenge . Pack( 'c*', 0x00, 0x00, 0x00, 0x00 ) ); if( !$Data ) { throw new MinecraftQueryException( "Failed to receive status." ); } $Last = ""; $Info = Array( ); $Data = SubStr( $Data, 11 ); // splitnum + 2 int $Data = Explode( "\x00\x00\x01player_\x00\x00", $Data ); $Players = SubStr( $Data[ 1 ], 0, -2 ); $Data = Explode( "\x00", $Data[ 0 ] ); // Array with known keys in order to validate the result // It can happen that server sends custom strings containing bad things (who can know!) $Keys = Array( 'hostname' => 'HostName', 'gametype' => 'GameType', 'version' => 'Version', 'plugins' => 'Plugins', 'map' => 'Map', 'numplayers' => 'Players', 'maxplayers' => 'MaxPlayers', 'hostport' => 'HostPort', 'hostip' => 'HostIp' ); foreach( $Data as $Key => $Value ) { if( ~$Key & 1 ) { if( !Array_Key_Exists( $Value, $Keys ) ) { $Last = false; continue; } $Last = $Keys[ $Value ]; $Info[ $Last ] = ""; } else if( $Last != false ) { $Info[ $Last ] = $Value; } } // Ints $Info[ 'Players' ] = IntVal( $Info[ 'Players' ] ); $Info[ 'MaxPlayers' ] = IntVal( $Info[ 'MaxPlayers' ] ); $Info[ 'HostPort' ] = IntVal( $Info[ 'HostPort' ] ); // Parse "plugins", if any if( $Info[ 'Plugins' ] ) { $Data = Explode( ": ", $Info[ 'Plugins' ], 2 ); $Info[ 'RawPlugins' ] = $Info[ 'Plugins' ]; $Info[ 'Software' ] = $Data[ 0 ]; if( Count( $Data ) == 2 ) { $Info[ 'Plugins' ] = Explode( "; ", $Data[ 1 ] ); } } else { $Info[ 'Software' ] = 'Vanilla'; } $this->Info = $Info; if( $Players ) { $this->Players = Explode( "\x00", $Players ); } } private function WriteData( $Command, $Append = "" ) { $Command = Pack( 'c*', 0xFE, 0xFD, $Command, 0x01, 0x02, 0x03, 0x04 ) . $Append; $Length = StrLen( $Command ); if( $Length !== FWrite( $this->Socket, $Command, $Length ) ) { throw new MinecraftQueryException( "Failed to write on socket." ); } $Data = FRead( $this->Socket, 2048 ); if( $Data === false ) { throw new MinecraftQueryException( "Failed to read from socket." ); } if( StrLen( $Data ) < 5 || $Data[ 0 ] != $Command[ 2 ] ) { return false; } return SubStr( $Data, 5 ); } } ?> Пробовал что то ти-по такого, Код (Text): print_r(GetPlayers('46.4.104.136',25572, 1)); Не получается. Подскажите пожалуйста.
Вы мне хоть подскажите вообще как сделать чтобы она заработала)) Пожалуйста. А то я тыкую, тыкаю. А толку нету(
Код (PHP): $obj = new MinecraftQuery(); $obj->Connect('your connect parameters'); echo $obj->GetPlayers('46.4.104.136',25572, 1);
так и должно быть? Fatal error: Uncaught exception 'MinecraftQueryException' with message 'Could not create socket: php_network_getaddresses: getaddrinfo failed: Name or service not known' in /home/wm5142/domains/gameamx.ru/public_html/host-m/mi/1/123.php:34 Stack trace: #0 /home/wm5142/domains/gameamx.ru/public_html/host-m/mi/1/123.php(190): MinecraftQuery->Connect('your connect pa...') #1 {main} thrown in /home/wm5142/domains/gameamx.ru/public_html/host-m/mi/1/123.php on line 34
ОМГ! Код (PHP): $this->Players = Explode( "\x00", $Players ); Код (PHP): public function GetPlayers( ) { return isset( $this->Players ) ? $this->Players : false; } О да, что бы это могло значить. Не уж, то ли это реально строка?
Ну поздравляю тебе удалось меня подловить я остановился на строке Код (PHP): $Players = SubStr( $Data[ 1 ], 0, -2 ); Массив возвращает, массив. Добавлено спустя 13 минут 26 секунд: Нет, конечно оно должно работать Что то мне подсказывает что не подставил параметры для коннекта. И да еще раз напишу метод возвращает массив
Все верно я задаю. Делаю так) Массив он выводит. так что не echo А Код (Text): print_r( $obj->GetInfo('209.160.36.58',25565, 1));