• Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
    Ручное создание новых тем невозможно.
Делаем счетчик онлайна игроков с птс через веб

Мануал Делаем счетчик онлайна игроков с птс через веб

  • Автор темы Автор темы Maksim
  • Дата начала Дата начала

Maksim

Легендарный
Местный
Знаток Lineage2
Любитель реакций
Неукротимое пламя
Старожил I степени
Сообщения
984
Розыгрыши
0
Решения
6
Репутация
596
Реакции
851
Баллы
1 708
Maksim добавил(а) новый ресурс:

Делаем счетчик онлайна игроков с птс через веб - Краткий пример счетчика онлайна.

Доброго вечера, по скольку пишу с смартфона ниже выложу код из заметок примера реализации счетчика онлайна под php 7.2.25.
Давайте сделаем это и закроем вопрос реализации счетчика онлайна на базе сервера птс, не hauth.

Код:
<?php
// Функция для проверки статуса сервера по TCP 7777
function check_server_status() {
    $host = 'localhost';
    $port = 7777;
    $timeout = 1;

    $socket = @fsockopen($host, $port, $errno, $errstr, $timeout);

    if ($socket === false) {...

Узнать больше об этом ресурсе...
 

если нужно что то кешировать советую разобраться с тем что такое Redis и с чем его едят, в композере кстати полно cache библиотек которые могут работать с редисом в т.ч.
ну и dsn бы описать все таки, а то оно же не будет работать
 
Maksim обновил(а) ресурс Делаем счетчик онлайна игроков с птс через веб новой записью:

#1 обновление

Переделано на redis.
Запрос подключения сделан по другому.
Изначальный вариант как говорил был взят с заметок на смартфоне.

Узнать больше об этом обновлении...
 
Зачем так сложно? Случайное число можно выводить в зависимости от времени, все равно никто не проверит.
 
На птсе есть специальный пакет который отдает информацию включая онлайн. Пакет ProtocolVersion с протоколом -1 -2 -3.
Примеры уже были можно попробовать найти на форуме.
 
Самое главное результат, чтобы выводился счетчик.
Как это происходит персональное дело каждого разработчика веб обвязки. :Cowboy:
 
На птсе есть специальный пакет который отдает информацию включая онлайн. Пакет ProtocolVersion с протоколом -1 -2 -3.
Примеры уже были можно попробовать найти на форуме.
PHP:
    public function VerCheck($id) {
            $fp = fsockopen("127.0.0.1", "7777", $errno, $errstr, 15);
            $rs = "";

            $buf = pack("c", 14);//0x0E
            $buf .= pack("i", $id);
            $len = unpack("v", fread($fp, 2)); $rid = unpack("c", fread($fp, 1));
            for ($i = 0; $i < (($len[1]-4) / 4); $i++) { $read = unpack("i", fread($fp, 4)); $rs .= $read[1]; }
            fclose($fp); return($rs);
    }

оно?
 
PHP:
    public function VerCheck($id) {
            $fp = fsockopen("127.0.0.1", "7777", $errno, $errstr, 15);
            $rs = "";

            $buf = pack("c", 14);//0x0E
            $buf .= pack("i", $id);
            $len = unpack("v", fread($fp, 2)); $rid = unpack("c", fread($fp, 1));
            for ($i = 0; $i < (($len[1]-4) / 4); $i++) { $read = unpack("i", fread($fp, 4)); $rs .= $read[1]; }
            fclose($fp); return($rs);
    }

оно?
Вот рабочий
хотя и этот наверно тоже будет работать.
 
Вариант с вытаскиванием онлайна игроков через пакетку хороший, но из базы надежнее, к примеру пакет может быть разный на птс.
В случае с базой, там многие вещи не изменялись уже 20+ лет ?
В любом случае выбор есть, если это лучше пользуйтесь. ☕
 
если нужно что то кешировать советую разобраться с тем что такое Redis
Зачем? Смысл? Ради получения онлайна это бред. Хватит элементарного кэша под это всё.
в композере кстати полно cache библиотек
Тянуть библиотеки, а за ними ещё с 10 зависимостей? Ради получения онлайна, как то такое себе увлечение. Пхпшного опкэша не хватит под это дело? Который кстати доступен даже на виртуальном хостинге, в отличие от того же редиса. Что мешает даже самый элементарный массив для кэша? Ну или уж прям совсем элементарный в виде файла. Потом вспоминается одно сообщение
20240411_011737.webp
 
Зачем? Смысл? Ради получения онлайна это бред. Хватит элементарного кэша под это всё.

Тянуть библиотеки, а за ними ещё с 10 зависимостей? Ради получения онлайна, как то такое себе увлечение. Пхпшного опкэша не хватит под это дело? Который кстати доступен даже на виртуальном хостинге, в отличие от того же редиса. Что мешает даже самый элементарный массив для кэша? Ну или уж прям совсем элементарный в виде файла. Потом вспоминается одно сообщение
Посмотреть вложение 74129
Ультанул)
 
Ради получения онлайна это бред
Да, в этом примере redis мож и нах не нужен, мессадж был про то, что лучше юзать более удобные решения чем запись чего то там в файл, а потом читать из этого файла. Хотя что то, то другое так или иначе пишет в конечном итоге в какие то там файлы. Что касается библиотек, если перед тобой стоит задача прикрутить кеширование - не надо сидеть и бздеть над своей технологией, есть куча библиотек которую ты достал из коробки поставил и завёл, всё, тебе осталось только сохранить в кеш и получить кеш, тебе не надо писать саму систему этого кеша, которая уже миллион раз написана в разных позах - выбирай на любой вкус. По поводу того что тянет за собой другие библиотеки - если потратить 10 минут , можно найти библиотеки с минимальными зависимостями, сам не люблю когда какая нибудь херня (недавно вот кстати искал решение для миграций) тянет за собой половину Laravel или Symfony (я щас про Doctrine, использовать конечно же его я буду там где он предустановлен, ибо нахер он нужен). Ну а так, пакеты очень облегчают жизнь и экономят время. В этом то вся и суть, у бизнеса нет времени ждать пока ты найдешь способ сделать свое решение легким и сэкономишь 100 мегабайт на диске юзера, есть задача выкатить фичу вчера - нет времени сидеть и думать как эту фичу сделать легковесной, надо прикрутить paypal? идешь в композер, ищешь paypal, импортируешь к себе, наследуешься и пишешь уже саму фичу, тебе надо по минимуму вникнуть в документацию и процессинги, и всё, готово, тебе не надо сидеть и описывать класс работы с апи, как то его рефакторить и тп, подключил, унаследовался и оно работает. Бизнес перед тобой ставит задачу прикрутить пайпал, а не написать с нуля класс который уже давно есть и он включает в себя зачастую все ендпоинты, если один чел будет неделю прикручивать пайпал, а другой за неделю прикрутит 10 платежек, понятно какой программист выгоден бизнесу, это же очевидно
 
Зачем? Смысл? Ради получения онлайна это бред. Хватит элементарного кэша под это всё.

Тянуть библиотеки, а за ними ещё с 10 зависимостей? Ради получения онлайна, как то такое себе увлечение. Пхпшного опкэша не хватит под это дело? Который кстати доступен даже на виртуальном хостинге, в отличие от того же редиса. Что мешает даже самый элементарный массив для кэша? Ну или уж прям совсем элементарный в виде файла. Потом вспоминается одно сообщение
Посмотреть вложение 74129
Я тоже придерживаюсь мнения, чем проще код тем лучше.
Оставлю еще прежний вариант без redis по классике. ?
 
Последнее редактирование:
Пхпшного опкэша не хватит под это дело
redis кроссплатформенный, хз причем тут opcache, это вроде как больше про производительность кода (хотя я с ним не работал могу ошибаться, но кажется назначение у него чутка другое), если имеется ввиду memcached тут возникает вопрос - а что если к тебе придет проггер с маком, как ему работать с проектом? с виндой еще ок, вроде как есть длл-ка на оф сайте... Если вы юзаете докер еще терпимо, но тоже такое себе, как по мне удобнее работать с кодом на хост-машине и видеть что происходит сразу после ctrl+s. Поэтому Redis, ты сразу лишаешь себя лишнего геморроя в будущем. Понятно, что по сабжу он тут нахер не вперся, наверно это проф деформация уже я не могу смотреть на процедурный код и самописный кеш в файликах в папке со скриптом :))
 
  • Мне нравится
Реакции: kick
Этот же код на python через процедуру
cоздаем процедуру
SQL:
USE [lin2world]
GO

/****** Object:  StoredProcedure [dbo].[GetUserCountWithLoginLessThanLogout]    Script Date: 06/15/2024 08:57:39 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[GetUserCountWithLoginMoreThanLogout]
AS
BEGIN
    SET NOCOUNT ON;

    SELECT COUNT(*)
    FROM dbo.user_data
    WHERE login > logout;
END

GO
само приложение
Python:
import socket
import os
import time
import pyodbc

# Подключение к базе данных MSSQL через ODBC и вызов хранимой процедуры
server = '127.0.0.1'
database = 'lin2world'
username = 'username'
password = 'password'
driver = 'ODBC Driver 17 for SQL Server'

connection_string = (
    f'DRIVER={driver};SERVER={server};DATABASE={database};UID={username};PWD={password}')

try:
    with pyodbc.connect(connection_string) as conn:
        cursor = conn.cursor()
        cursor.execute("EXEC GetUserCountWithLoginMoreThanLogout")
        count = cursor.fetchone()[0]
        print(count)
except pyodbc.Error as e:
    print("Error:", e)

p.s. Мистер автор не знаю толи в логике ашипка, толи ещё где но запрос корректно заработал, когда развернул знак больше в другую сторону "login < logout" :D
 
Аккаунты которые только что созданные содержат NULL в логаут, в статистику не попадают, поправил запрос.
SQL:
SELECT *
FROM 
    dbo.user_data
WHERE 
    login > ISNULL(logout, '1900-01-01 00:00:00');
 
Назад
Сверху Снизу