Получаем данные с игрового сервера на PHP

Получаем данные с игрового сервера

В этой статье речь пойдет об играх на движке Source и о том, как при помощи одной PHP библиотеки можно получать данные с игрового сервера. Это может понадобиться вам для вывода этих данных на вашем сайте. Для получения данных используется Steam query protocol, также известный как Source Engine Query protocol.

Если вы используете Composer, то сможете установить библиотеку всего одной командой:

composer require xpaw/php-source-query-class

Или самостоятельно добавить запись в composer.json вашего проекта:

"xpaw/php-source-query-class": "^2.1"

Но в этом случае, вам еще нужно будет выполнить команду composer install для загрузки пакета.

Далее в вашем PHP скрипте необходимо подключить скрипт автозагрузки :

<?php
require __DIR__ . '/vendor/autoload.php'; // измените путь в соответствии с вашим

Если вы не используете Composer, то можете просто скачать архив с библиотекой по ссылке, но на ваш сервер нужно загрузить лишь папку SourceQuery из архива. Предположим, что вы загрузили ее в директорию inc вашего проекта и теперь остается подключить библиотеку следующим образом:

<?php
require_once __DIR__ . '/inc/SourceQuery/bootstrap.php'; // измените путь в соответствии с вашим

Далее нам остается задействовать библиотеку, а также объявить константы или переменные с данными для подключения к вашему серверу. В моем примере это будут константы:

use xPaw\SourceQuery\SourceQuery;

// Данные сервера
define('SQ_SERVER_ADDR', 'IP сервера');
define('SQ_SERVER_PORT', 27015);
define('SQ_TIMEOUT', 1);
define('SQ_ENGINE', SourceQuery::SOURCE);

Примеры кода для получения данных с игрового сервера

Получаем основную информацию

$Query = new SourceQuery();
try {
    $Query->Connect(SQ_SERVER_ADDR, SQ_SERVER_PORT, SQ_TIMEOUT, SQ_ENGINE);
    $server_info = $Query->GetInfo();
    $password = $server_info['Password']; // пароль сервера
    $map = $server_info['Map']; // карта на сервере
    $players = $server_info['Players']; // кол-во игроков онлайн
    $max_players = $server_info['MaxPlayers']; // макс игроков (слотов)

    if (empty($password)) {
        // здесь, при желании вы можете вывести на ваш сайт информацию, что сервер онлайн
    }
    else {
        // а здесь, что сервер под паролем
    }
}
catch(Exception $e) {
    // а здесь, что сервер оффлайн
}
finally {
    $Query->Disconnect();
}

Получаем список игроков онлайн

$Query = new SourceQuery();
try {
    $Query->Connect(SQ_SERVER_ADDR, SQ_SERVER_PORT, SQ_TIMEOUT, SQ_ENGINE);
    $players = $Query->GetPlayers();
    var_dump($players); // выведет вам массив с игроками онлайн, дальше придумаете что с ним делать
}
catch(Exception $e) {}
finally {
    $Query->Disconnect();
}

В общем-то это всё.

Однако, стоит добавить, что библиотека также умеет выполнять RCON команды, поэтому, если у вас включен RCON, вы можете выполнять команды следующим образом:

$Query = new SourceQuery();
try {
    $Query->Connect(SQ_SERVER_ADDR, SQ_SERVER_PORT, SQ_TIMEOUT, SQ_ENGINE);
    $Query->SetRconPassword('your_rcon_password');
    var_dump($Query->Rcon('say hello'));

}
catch(Exception $e) {
    echo $e->getMessage();
}
finally {
    $Query->Disconnect();
}