Implementácia živých kasínových hier pomocou WebSocketov v PHP a Laraveli

Implementácia živých kasínových hier predstavuje moderný a atraktívny spôsob, ako zaujať hráčov a poskytnúť im autentický zážitok z hry. Použitie WebSocketov umožňuje real-time komunikáciu medzi serverom a klientom, čím sa dosahuje plynulé a rýchle reagovanie na herné udalosti. V tomto článku si ukážeme, ako vytvoriť živé kasínové hry pomocou PHP a Laravelu, konkrétne sa zameriame na nastavenie WebSocketov, real-time komunikáciu, synchronizáciu herných udalostí a optimalizáciu výkonu.

Nastavenie WebSocketov

Inštalácia potrebných balíkov

Najprv je potrebné nainštalovať niekoľko balíkov, ktoré nám umožnia pracovať s WebSocketmi v Laraveli. Použijeme balíky beyondcode/laravel-websockets a pusher/pusher-php-server.

composer require beyondcode/laravel-websockets pusher/pusher-php-server

Konfigurácia WebSocket servera

Po inštalácii balíkov je potrebné nastaviť WebSocket server. V súbore config/broadcasting.php pridáme nastavenia pre Pusher:

'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true,
'host' => env('PUSHER_APP_HOST', '127.0.0.1'),
'port' => env('PUSHER_APP_PORT', 6001),
'scheme' => env('PUSHER_APP_SCHEME', 'http'),
],
],
],

Vytvoríme aj súbor websockets.php v priečinku config:

return [
'apps' => [
[
'id' => env('PUSHER_APP_ID'),
'name' => env('APP_NAME'),
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'path' => env('PUSHER_APP_PATH'),
'capacity' => null,
'enable_client_messages' => false,
'enable_statistics' => true,
],
],
'metrics' => [
'statistics' => true,
],
];

Následne spustíme WebSocket server príkazom:

php artisan websockets:serve

Real-time komunikácia medzi serverom a klientom

Definovanie eventov

Vytvoríme novú triedu pre herné udalosti, ktoré budeme vysielať prostredníctvom WebSocketov. Vytvoríme súbor GameEvent.php v priečinku app/Events:

namespace App\Events;
 use Illuminate\Broadcasting\Channel;
 use Illuminate\Broadcasting\InteractsWithSockets;
 use Illuminate\Broadcasting\PresenceChannel;
 use Illuminate\Broadcasting\PrivateChannel;
 use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
 use Illuminate\Queue\SerializesModels;
 class GameEvent implements ShouldBroadcast
 {
     use InteractsWithSockets, SerializesModels;
 public $message; public function __construct($message) {     $this->message = $message; } public function broadcastOn() {     return new Channel('game-channel'); }
 }

Vysielanie udalostí

V hernej logike, napríklad v kontroleri, môžeme vysielať udalosti:

use App\Events\GameEvent;
 public function startGame()
 {
     $message = 'Hra začína!';
     broadcast(new GameEvent($message));
 }

Prijímanie udalostí na klientskej strane

Na strane klienta použijeme knižnicu Laravel Echo a Pusher. Najprv pridáme potrebné knižnice do projektu pomocou npm:

npm install --save laravel-echo pusher-js

V súbore resources/js/bootstrap.js nastavíme Laravel Echo:

import Echo from "laravel-echo";
window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    encrypted: true,
});

Pridáme kód pre prijímanie udalostí v komponentoch Vue alebo v JavaScripte:

window.Echo.channel('game-channel')
    .listen('GameEvent', (e) => {
        console.log(e.message);
    });

Synchronizácia herných udalostí

Synchronizácia herných udalostí je kľúčová pre plynulý priebeh každej casino hry. Každá akcia hráča musí byť okamžite prenesená všetkým ostatným hráčom. To dosiahneme vysielaním udalostí na serveri a prijímaním na klientovi, ako sme už demonštrovali.

Príklad synchronizácie

Ak hráč vsadí, udalosť o stávke je vyslaná všetkým hráčom:

use App\Events\GameEvent;

public function placeBet(Request $request)
{
    $betDetails = $request->input('bet');
    broadcast(new GameEvent("Hráč vsadil: $betDetails"));
}

Na strane klienta sa udalosť prijme a spracuje:

window.Echo.channel('game-channel')
    .listen('GameEvent', (e) => {
        updateGameUI(e.message);
    });

function updateGameUI(message) {
    console.log(message);
    // Aktualizácia herného rozhrania na základe prijatého message
}

Optimalizácia výkonu

Kešovanie a kompresia

Aby sme minimalizovali latenciu a optimalizovali výkon, je dôležité používať kešovanie a kompresiu. Napríklad môžeme použiť Redis pre kešovanie často používaných údajov.

Inštalácia a konfigurácia Redis

Najprv nainštalujeme Redis server a príslušný PHP balík:

sudo apt-get install redis-server
composer require predis/predis

V súbore .env nastavíme Redis ako predvolený driver pre kešovanie:

CACHE_DRIVER=redis

V súbore config/cache.php aktualizujeme nastavenia:

'default' => env('CACHE_DRIVER', 'file'),

'stores' => [
    'redis' => [
        'driver' => 'redis',
        'connection' => 'default',
    ],
],

Použitie kešovania v aplikácii

V kontroleri môžeme použiť kešovanie na uloženie často používaných údajov:

use Illuminate\Support\Facades\Cache;

public function getGameData()
{
    $gameData = Cache::remember('game-data', 60, function () {
        return Game::all();
    });

    return response()->json($gameData);
}

Balansovanie záťaže

Pre škálovateľnosť aplikácie je vhodné použiť balansovanie záťaže, aby sme zabezpečili plynulý chod aplikácie aj pri vysokom počte používateľov.

Nastavenie Nginx pre balansovanie záťaže

Príklad konfigurácie Nginx pre balansovanie záťaže:

http {
    upstream myapp {
        server app1.example.com;
        server app2.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

Monitorovanie výkonu

Na monitorovanie výkonu a ladenie problémov môžeme použiť nástroje ako Laravel Telescope alebo Horizon.

Inštalácia Laravel Telescope

composer require laravel/telescope
php artisan telescope:install
php artisan migrate
php artisan telescope:publish

Aktivujeme Telescope v súbore AppServiceProvider:

use Laravel\Telescope\Telescope;
use Laravel\Telescope\TelescopeApplicationServiceProvider;

public function register()
{
    $this->app->register(TelescopeServiceProvider::class);
}

Monitorovanie úloh pomocou Laravel Horizon

composer require laravel/horizon
php artisan horizon:install
php artisan migrate

Aktivujeme Horizon v súbore AppServiceProvider:

use Laravel\Horizon\Horizon;

public function boot()
{
    Horizon::auth(function ($request) {
        // Autentifikácia pre prístup k Horizon dashboardu
        return true;
    });
}

Spustíme Horizon server:

php artisan horizon

Tak a na záver treba povedať, že implementácia živých kasínových hier u klienta pomocou WebSocketov v PHP a Laraveli umožňuje vytvoriť dynamické a interaktívne herné prostredie. Vďaka real-time komunikácii medzi serverom a klientom môžu hráči zažiť plynulú a rýchlu hru, s dobrými parametrami. Treba ale povedať, že aj keď nastavíte všetko ako nastaviť máte môžu nastať okolnosti, že to nebude hladko bežať, ako napríklad vysoká sieťová latencia ktoré môže spôsobiť oneskorenia v komunikácii medzi klientom a serverom, čo môže negatívne ovplyvniť herný zážitok. Tento problém sa môže vyskytnúť v dôsledku vzdialenosti medzi hráčmi a serverom alebo preťaženia siete. Ďalej servery s vysokým zaťažením pri vysokom počte súčasne pripojených hráčov. To môže viesť k zníženiu výkonu a pomalým reakciám na herné udalosti a nekonzistentné pripojenie používateľov, teda ľudskou rečou nestabilné internetové pripojenie hráčov ktoré môže spôsobiť prerušovanie spojenia a nekonzistentnú hernú skúsenosť.

Fulltextové vyhľadávanie v PHP a MySQL

31.08.2024

Fulltextové vyhľadávanie v MySQL umožňuje efektívne prehľadávanie veľkých textových dát. Základný script ktorý potrebujeme a ktorý si môžete prispôsobiť podľa svojich potrieb, napríklad pridať ďalšie polia na vyhľadávanie alebo upraviť vzhľad výsledkov je tento: Vysvetlenie kódu Konfigurácia databázy a pripojenie: Nastavenie parametrov pripojenia k databáze. [...]

Kompletný skript pre odosielanie e-mailov pomocou PHPMailer vrátane konfigurácie SMTP

19.08.2024

Vysvetlenie kódu: Autoloader: Použitím Composeru načítame potrebné triedy z PHPMaileru. SMTP konfigurácia: Nastavíme pripojenie k SMTP serveru vrátane hostiteľa, portu, používateľského mena a hesla. Nastavenie príjemcov: Pridáme odosielateľa, príjemcu a voliteľnú adresu pre odpovede. Nastavenie obsahu e-mailu: Definujeme predmet, telo e-mailu vo formáte HTML a alternatívny [...]

Správa používateľov a rolí pomocou Laravelu

09.08.2024

Správa používateľov a ich rolí je jednou zo základných funkcií, ktoré potrebuje takmer každá webová aplikácia. V tomto článku sa pozrieme na to, ako implementovať robustný systém správy používateľov a rolí pomocou frameworku Laravel. Zameriame sa na vytváranie používateľov, prideľovanie rolí a implementáciu autorizácie na základe týchto rolí. Nastavenie [...]

summit, Robert Fico, Brusel

Fico v pondelok pôjde do Moskvy, tvrdí srbský prezident. Bude s Putinom rokovať o plyne

21.12.2024 12:39, aktualizované: 17:04

Slovenský premiér Robert Fico (Smer) sa 23. decembra stretne s ruským prezidentom Vladimirom Putinom.

Polícia / Pomáhať a chrániť / Policajné auto /

Majiteľ rodinného domu v Malackách strieľal na votrelca zo svojej legálne držanej zbrane

21.12.2024 11:16

Predmetom vyšetrovania bude aj posúdenie použitia zbrane v súlade so zákonmi.

Nemecko Magdeburk, auto vrazilo do davu

Počet obetí piatkového útoku v Magdeburgu stúpol na päť, vyše 200 je ranených

21.12.2024 10:31, aktualizované: 15:20

40 ľudí je v kritickom stave.

Policie CZ / Praha /

Česko si pripomína prvé výročie tragickej streľby na Univerzite Karlovej

21.12.2024 10:15

Na následky útoku zomrelo okrem strelca 14 ľudí a ďalších 25 bolo zranených.

janvarga

Blog o mojej práci a vášni zároveň. Programujem v PHP a ako najčastejšie cms používam wordpress ako nedokonalú ale modernejšiu náhradu za drupal a typo3. A tom sú moje články.

Štatistiky blogu

Počet článkov: 8
Celková čítanosť: 6102x
Priemerná čítanosť článkov: 763x

Autor blogu

Kategórie

Archív