Založ si blog

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 [...]

Rusko Iževsk škola streľba

Študent v Čeľabinsku zaútočil kladivom na spolužiakov a učiteľov, štyroch zranil

16.09.2024 18:07

Putin označuje takéto incidenty za importované zo Spojených štátov a vinu pripisuje globalizácii.

Stupava záplavy povodeň

Škody po povodniach sú veľké, to najhoršie ešte nie je za nami, vyhlásil Fico. Stretol sa aj s Vallom, Drobom a Viskupičom

16.09.2024 17:21, aktualizované: 18:38

Podľa premiéra je vysoko pravdepodobné, že by nemalo dôjsť k ďalšiemu ohrozeniu majetku a životov.

povode, záplavy, Devínska Nová Ves

Domy v Devínskej Novej Vsi sú stále pod vodou, miestni spomínajú na povodeň spred 11 rokov. Tvrdia, že bolo horšie

16.09.2024 17:15

Obyvatelia Devínskej Novej Vsi ani nemusia sledovať správy o stúpajúcich hladinách Dunaja a Moravy. Vývoj hydrologickej situácie do slova cítia na vlastnej koži

polícia, páska, požiar

V banskej šachte v Koši objavili dvoch mužov bez známok života. Uzatvorená bola už dva roky

16.09.2024 15:23, aktualizované: 16:11

Polícia začala trestné stíhanie vo veci prečinu usmrtenia.

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ť: 5119x
Priemerná čítanosť článkov: 640x

Autor blogu

Kategórie

Archív