-1

minecraft サーバーを一覧表示するこの Web サイトを作成しています。基本的に、表示されているすべてのサーバーに対して ping を実行しようとしています。この問題を PHP で解決しても、完全には解決されません。すべてのサーバーに ping を実行するには時間がかかります。また、javascript が複数の「ping」を同時に実行できることもわかっています。どうすればいいですか?

私が今使っているPHPコード:

class minecraft_server
{
    private $address;
    private $port;

    public function __construct($address, $port = 25565){
        $this->address = $address;
        $this->port = $port;
    }

    public function get_ping_info(&$info){

        $starttime = microtime(true);
        $socket = @fsockopen($this->address, $this->port, $errno, $errstr, 1.0);
        $stoptime  = microtime(true);
        $ping = round(($stoptime-$starttime)*1000);

        if ($socket === false){
            return false;
        }

        fwrite($socket, "\xfe\x01");

        $data = fread($socket, 256);

        if (substr($data, 0, 1) != "\xff"){
            return false;
        }

        if (substr($data, 3, 5) == "\x00\xa7\x00\x31\x00"){
            $data = explode("\x00", mb_convert_encoding(substr($data, 15), 'UTF-8', 'UCS-2'));
        }else{
            $data = explode('§', mb_convert_encoding(substr($data, 3), 'UTF-8', 'UCS-2'));
        }

        if (count($data) == 3){
            $info = array(
                'version'       => '1.3.2',
                'motd'          => $data[0],
                'players'       => intval($data[1]),
                'max_players'   => intval($data[2]),
                'ping'          => $ping
            );
        }else{
            $info = array(
                'version'       => $data[0],
                'motd'          => $data[1],
                'players'       => intval($data[2]),
                'max_players'   => intval($data[3]),
                'ping'          => $ping
            );
        }

        return true;
    }
}

そして、次のように関数を呼び出します。

$server = new minecraft_server(IP, PORT);
if (!$server->get_ping_info($info)){
    echo "Offline";
}else{
    print_r($info);
}

JavaScriptで同様のものを作成するにはどうすればよいですか?

4

1 に答える 1