<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>https://wiki.zdechov.net/index.php?action=history&amp;feed=atom&amp;title=Dynamick%C3%A9_povolov%C3%A1n%C3%AD_registrac%C3%AD</id>
	<title>Dynamické povolování registrací - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.zdechov.net/index.php?action=history&amp;feed=atom&amp;title=Dynamick%C3%A9_povolov%C3%A1n%C3%AD_registrac%C3%AD"/>
	<link rel="alternate" type="text/html" href="https://wiki.zdechov.net/index.php?title=Dynamick%C3%A9_povolov%C3%A1n%C3%AD_registrac%C3%AD&amp;action=history"/>
	<updated>2026-04-03T18:27:36Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.zdechov.net/index.php?title=Dynamick%C3%A9_povolov%C3%A1n%C3%AD_registrac%C3%AD&amp;diff=387&amp;oldid=prev</id>
		<title>Chronos: Založena nová stránka: =Úvod=  Existují servery malé, střední a velké. Co server, to různá koncepce jak jej co nejlevněji financovat. Zatímco v případě velkých serverů majitelé v…</title>
		<link rel="alternate" type="text/html" href="https://wiki.zdechov.net/index.php?title=Dynamick%C3%A9_povolov%C3%A1n%C3%AD_registrac%C3%AD&amp;diff=387&amp;oldid=prev"/>
		<updated>2011-02-05T09:29:40Z</updated>

		<summary type="html">&lt;p&gt;Založena nová stránka: =Úvod=  Existují servery malé, střední a velké. Co server, to různá koncepce jak jej co nejlevněji financovat. Zatímco v případě velkých serverů majitelé v…&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Úvod=&lt;br /&gt;
&lt;br /&gt;
Existují servery malé, střední a velké. Co server, to různá koncepce jak jej co nejlevněji financovat. Zatímco v případě velkých serverů majitelé většinou investují do drahého hardware a rychlého internetového připojení, které je nutno odpovídajícím způsobem měsíčně platit, tak některé menší servery jdou spíše cestou minimálních nákladů a majitelé je provozují např. doma, kde však nemusí mít dostatečnou kapacitu internetové linky v odchozím směru. Tak či tak, každý server může narazit pod náporem hráčů na své limity a musí pak přistoupit k omezení množství hráčů.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Existují dvě místa, kde lze tento počet omezit:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Omezit max. počet hráčů online&lt;br /&gt;
* Omezit počet nových registrací&lt;br /&gt;
&lt;br /&gt;
V prvním případě jsou však hráči při dosažení kapacity zařazovány do fronty a musí čekat, až se na ně dostane řada. To je nevýhodné z toho pohledu, že starší hráči musí čekat na úkor nově příchozích a v konečném důsledku mohou být nespokojeni všichni.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Naproti tomu pokud se zabrání příchodu nových hráčů, tak staří se mohou kdykoliv připojit a noví se na server ani nedostanou a tak nemají pocit, že o něco přicházejí.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Omezit registrace lze různým způsobem:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Ručně je podle uvážení zablokovat&lt;br /&gt;
* Ručně zpracovávat všechny registrace přes email&lt;br /&gt;
* Pouze stávající hráči mohou rozdávat pozvánky novým hráčům&lt;br /&gt;
* Konstantně omezit denní počet registrací&lt;br /&gt;
* Dynamicky povolovat registrace k dosažen požadovaného množství hráčů&lt;br /&gt;
&lt;br /&gt;
Každý ze způsobů má své výhody a nevýhody a jejich realizace je různě složitá. Každopádně pokud server má omezenu kapacitu a majitel chce udržovat počet online hráčů na určité úrovni, tak může s výhodou použít poslední uvedenou variantu a tedy automatický systém regulace. Pak počty připojených hráčů budou se budou přibližovat k žádané hodnotě a budou kolem ní v obou směrech oscilovat. Samotný online limit lze nastavit např. na 1,5 násobek předpokládané hodnoty, aby se všichni hráči vždy mohly připojit.&lt;br /&gt;
&lt;br /&gt;
=Realizace=&lt;br /&gt;
&lt;br /&gt;
Aby mohlo automatické omezování správně fungovat, potřebuje mít k výpočtu informaci o:&lt;br /&gt;
* Počtu účtů na konci předchozího dne&lt;br /&gt;
* Aktuální počet účtů&lt;br /&gt;
* Nejvyšší počet hráčů online během předchozího dne&lt;br /&gt;
* Požadovaný počet online hráčů&lt;br /&gt;
&lt;br /&gt;
==Inicializace databáze==&lt;br /&gt;
Aby bylo možné tyto údaje získat a někde uchovat, je potřeba si vytvořit v databázi pomocnou tabulku:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;CREATE TABLE IF NOT EXISTS `CharacterOnlineHistory` (&lt;br /&gt;
  `Date` date NOT NULL,&lt;br /&gt;
  `Min` int(11) NOT NULL,&lt;br /&gt;
  `Max` int(11) NOT NULL,&lt;br /&gt;
  `AccountCount` int(11) NOT NULL,&lt;br /&gt;
  PRIMARY KEY  (`Date`)&lt;br /&gt;
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zde je uveden datum Date jakožto primární klíč a pak maximální počet online hráčů a počet účtů ke konci daného dne AccountCount. Hodnota Min je zde spíše pro zajímavost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Základní třída RegistrationLimit==&lt;br /&gt;
Zde je PHP třída uložená v souboru registration_limit.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
class RegistrationLimit&lt;br /&gt;
{&lt;br /&gt;
  var $db;&lt;br /&gt;
  var $Server;&lt;br /&gt;
  var $Config;&lt;br /&gt;
  &lt;br /&gt;
  function __construct($db, $Server, $Config)&lt;br /&gt;
  {&lt;br /&gt;
    $this-&amp;gt;db = $db;&lt;br /&gt;
    $this-&amp;gt;Server = $Server;&lt;br /&gt;
    $this-&amp;gt;Config = $Config;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  function Update()&lt;br /&gt;
  {&lt;br /&gt;
    $AccountOnlineCount = $this-&amp;gt;Server-&amp;gt;RealmOnline();&lt;br /&gt;
    $AccountCount = $this-&amp;gt;Server-&amp;gt;AccountCount();&lt;br /&gt;
&lt;br /&gt;
    $this-&amp;gt;db-&amp;gt;select_db($this-&amp;gt;Config[&amp;#039;Database&amp;#039;][&amp;#039;Database&amp;#039;]);&lt;br /&gt;
    $DbResult = $this-&amp;gt;db-&amp;gt;query(&amp;#039;SELECT * FROM `CharacterOnlineHistory` WHERE `Date` = CURDATE()&amp;#039;);&lt;br /&gt;
    if($DbResult-&amp;gt;num_rows &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
      // Update max, min&lt;br /&gt;
      $this-&amp;gt;db-&amp;gt;query(&amp;#039;UPDATE `CharacterOnlineHistory` SET `Max` = GREATEST(`Max`, &amp;#039;.$AccountOnlineCount.&amp;#039;), `Min` = LEAST(`Min`, &amp;#039;.$AccountOnlineCount.&amp;#039;), `AccountCount` = &amp;#039;.$AccountCount.&amp;#039; WHERE `Date` = CURDATE()&amp;#039;);&lt;br /&gt;
    } else &lt;br /&gt;
      $this-&amp;gt;db-&amp;gt;query(&amp;#039;INSERT INTO `CharacterOnlineHistory` (`Max`, `Min`, `Date`, `AccountCount`) VALUES (&amp;#039;.$AccountOnlineCount.&amp;#039;, &amp;#039;.$AccountOnlineCount.&amp;#039;, CURDATE(), &amp;#039;.$AccountCount.&amp;#039;)&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  function GetFreeRegistrationCount()&lt;br /&gt;
  {&lt;br /&gt;
    $AccountCount = $this-&amp;gt;Server-&amp;gt;AccountCount();&lt;br /&gt;
&lt;br /&gt;
    $this-&amp;gt;db-&amp;gt;select_db($this-&amp;gt;Config[&amp;#039;Database&amp;#039;][&amp;#039;Database&amp;#039;]);&lt;br /&gt;
    $DbResult = $this-&amp;gt;db-&amp;gt;query(&amp;#039;SELECT * FROM `CharacterOnlineHistory` WHERE `Date` = DATE_SUB(CURDATE(), INTERVAL 1 DAY)&amp;#039;);&lt;br /&gt;
    if($DbResult-&amp;gt;num_rows &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
      $Yesterday = $DbResult-&amp;gt;fetch_assoc();&lt;br /&gt;
    } else &lt;br /&gt;
      $Yesterday = array(&amp;#039;Max&amp;#039; =&amp;gt; 0, &amp;#039;AccountCount&amp;#039; =&amp;gt; 0);&lt;br /&gt;
 &lt;br /&gt;
    $NextDayFreeRegistration = $this-&amp;gt;Config[&amp;#039;Mangos&amp;#039;][&amp;#039;RequiredOnlinePlayers&amp;#039;] - $Yesterday[&amp;#039;Max&amp;#039;];&lt;br /&gt;
    if($NextDayFreeRegistration &amp;lt; 0) $NextDayFreeRegistration = 0;&lt;br /&gt;
    $NextDayUsedRegistration = $AccountCount - $Yesterday[&amp;#039;AccountCount&amp;#039;];&lt;br /&gt;
    $FreeRegistration = $NextDayFreeRegistration - $NextDayUsedRegistration;&lt;br /&gt;
    if($FreeRegistration &amp;lt; 0) $FreeRegistration = 0;&lt;br /&gt;
    return($FreeRegistration);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function GetPerDeyRegistrationCount()&lt;br /&gt;
  {&lt;br /&gt;
    $AccountCount = $this-&amp;gt;Server-&amp;gt;AccountCount();&lt;br /&gt;
&lt;br /&gt;
    $this-&amp;gt;db-&amp;gt;select_db($this-&amp;gt;Config[&amp;#039;Database&amp;#039;][&amp;#039;Database&amp;#039;]);&lt;br /&gt;
    $DbResult = $this-&amp;gt;db-&amp;gt;query(&amp;#039;SELECT * FROM `CharacterOnlineHistory` WHERE `Date` = DATE_SUB(CURDATE(), INTERVAL 1 DAY)&amp;#039;);&lt;br /&gt;
    if($DbResult-&amp;gt;num_rows &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
      $Yesterday = $DbResult-&amp;gt;fetch_assoc();&lt;br /&gt;
    } else &lt;br /&gt;
      $Yesterday = array(&amp;#039;Max&amp;#039; =&amp;gt; 0, &amp;#039;AccountCount&amp;#039; =&amp;gt; 0);&lt;br /&gt;
  &lt;br /&gt;
    $NextDayFreeRegistration = $this-&amp;gt;Config[&amp;#039;Mangos&amp;#039;][&amp;#039;RequiredOnlinePlayers&amp;#039;] - $Yesterday[&amp;#039;Max&amp;#039;];&lt;br /&gt;
    if($NextDayFreeRegistration &amp;lt; 0) $NextDayFreeRegistration = 0;&lt;br /&gt;
    return($NextDayFreeRegistration);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Třída poskytuje tři funkce:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Update() - tuto funkci je potřeba během dne periodicky volat, aby bylo možné zjistit maximum hráčů online. Také ukládá počet účtů na konci dne.&lt;br /&gt;
* GetFreeRegistrationCount() - Vrací zbývající počet povolených registrací pro aktuální den.&lt;br /&gt;
* GetPerDeyRegistrationCount() - Vrací celkový počet povolených registrací pro aktuální den.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Konfigurační soubor==&lt;br /&gt;
Nastavení lze provést přes parametr $Config. Ten lze inicializovat pomocí souboru config.php např. takto:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$Config = array(&lt;br /&gt;
  &amp;#039;Database&amp;#039; =&amp;gt; array&lt;br /&gt;
  (&lt;br /&gt;
    &amp;#039;Host&amp;#039; =&amp;gt; &amp;#039;localhost&amp;#039;,&lt;br /&gt;
    &amp;#039;User&amp;#039; =&amp;gt; &amp;#039;root&amp;#039;,&lt;br /&gt;
    &amp;#039;Password&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;Database&amp;#039; =&amp;gt; &amp;#039;wow&amp;#039;,&lt;br /&gt;
    &amp;#039;Prefix&amp;#039; =&amp;gt; &amp;#039;&amp;#039;,&lt;br /&gt;
    &amp;#039;Charset&amp;#039; =&amp;gt; &amp;#039;utf8&amp;#039;,&lt;br /&gt;
  ),&lt;br /&gt;
  &amp;#039;Mangos&amp;#039; =&amp;gt; array(&lt;br /&gt;
    &amp;#039;DatabaseRealmd&amp;#039; =&amp;gt; &amp;#039;realmd&amp;#039;,&lt;br /&gt;
    &amp;#039;RequiredOnlinePlayers&amp;#039; =&amp;gt; 200,&lt;br /&gt;
  ),&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
Samozřejmě je potřeba doplnit patřičné přihlašovací údaje k databázi s umístěním pomocné tabulky.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Aktualizace dat==&lt;br /&gt;
Pro zjištění počtu hráčů online je nutno pravidelně během dnes např. každých 5 minut kontrolovat jejich stav. To zajistí jednoduchý skript registration_update.php:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
include(&amp;#039;server.php&amp;#039;);&lt;br /&gt;
include(&amp;#039;registration_limit.php&amp;#039;);&lt;br /&gt;
include(&amp;#039;config.php&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
$db = new mysqli($Config[&amp;#039;Database&amp;#039;][&amp;#039;Host&amp;#039;], $Config[&amp;#039;Database&amp;#039;][&amp;#039;User&amp;#039;], $Config[&amp;#039;Database&amp;#039;][&amp;#039;Password&amp;#039;], $Config[&amp;#039;Database&amp;#039;][&amp;#039;Database&amp;#039;]);&lt;br /&gt;
$Server = new Server($db, $Config);&lt;br /&gt;
$RegistrationLimit = new RegistrationLimit($db, $Server, $Config);&lt;br /&gt;
&lt;br /&gt;
$RegistrationLimit-&amp;gt;Update();&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volání lze realizovat pomocí systémového plánovače ve Windows nebo v Linuxu pomocí plánovače cron:&lt;br /&gt;
&lt;br /&gt;
Soubor registration_update.sh:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;#!/bin/sh&lt;br /&gt;
cd /var/www/html&lt;br /&gt;
php registration_update.php&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provádění každou minutu přes cron:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;* * * * * registration_update.sh&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Třída Server==&lt;br /&gt;
Ke správnému spuštění je pak ještě nutné doplnit třídu obstarávající užitečné funkce k serveru server.php. Zde jsou alespoň nejnutnější funkce:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;class Server&lt;br /&gt;
{&lt;br /&gt;
  private $db;&lt;br /&gt;
  private $Config;&lt;br /&gt;
&lt;br /&gt;
  public function __construct($db, $Config)&lt;br /&gt;
  {&lt;br /&gt;
    $this-&amp;gt;db = $db;&lt;br /&gt;
    $this-&amp;gt;Config = $Config;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public function RealmOnline()&lt;br /&gt;
  {&lt;br /&gt;
    $this-&amp;gt;db-&amp;gt;select_db($this-&amp;gt;Config[&amp;#039;Mangos&amp;#039;][&amp;#039;DatabaseRealmd&amp;#039;]);&lt;br /&gt;
    $DbResult = $this-&amp;gt;db-&amp;gt;query(&amp;#039;SELECT COUNT(*) FROM `account` WHERE `online` = 1&amp;#039;);&lt;br /&gt;
    $DbRow = $DbResult-&amp;gt;fetch_row();&lt;br /&gt;
    return($DbRow[0]);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public function AccountCount()&lt;br /&gt;
  {&lt;br /&gt;
    $this-&amp;gt;db-&amp;gt;select_db($this-&amp;gt;Config[&amp;#039;Mangos&amp;#039;][&amp;#039;DatabaseRealmd&amp;#039;]);&lt;br /&gt;
    $row = $this-&amp;gt;db-&amp;gt;query(&amp;#039;SELECT COUNT(*) FROM account&amp;#039;)-&amp;gt;fetch_row();&lt;br /&gt;
    return($row[0]);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zobrazení a kontrola stavu==&lt;br /&gt;
Nakonec na stránce Registrace lze pak už jednoduše povolovat registrace a zobrazit jejich stav.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
include(&amp;#039;server.php&amp;#039;);&lt;br /&gt;
include(&amp;#039;registration_limit.php&amp;#039;);&lt;br /&gt;
include(&amp;#039;config.php&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
$db = new mysqli($Config[&amp;#039;Database&amp;#039;][&amp;#039;Host&amp;#039;], $Config[&amp;#039;Database&amp;#039;][&amp;#039;User&amp;#039;], $Config[&amp;#039;Database&amp;#039;][&amp;#039;Password&amp;#039;], $Config[&amp;#039;Database&amp;#039;][&amp;#039;Database&amp;#039;]);&lt;br /&gt;
$Server = new Server($db, $Config);&lt;br /&gt;
$RegistrationLimit = new RegistrationLimit($db, $Server, $Config);&lt;br /&gt;
&lt;br /&gt;
echo(&amp;#039;Dnes celkem povolených registrací: &amp;#039;.$RegistrationLimit-&amp;gt;GetPerDeyRegistrationCount().&amp;#039;&amp;lt;br/&amp;gt;&amp;#039;);&lt;br /&gt;
echo(&amp;#039;Dnes zbývajících registrací: &amp;#039;.$RegistrationLimit-&amp;gt;GetFreeRegistrationCount().&amp;#039;&amp;lt;br/&amp;gt;&amp;#039;);&lt;br /&gt;
echo(&amp;#039;&amp;lt;br/&amp;gt;&amp;#039;);&lt;br /&gt;
if($RegistrationLimit-&amp;gt;GetFreeRegistrationCount() &amp;gt; 0)&lt;br /&gt;
{&lt;br /&gt;
  // Zobrazení registračního formuláře&lt;br /&gt;
} else&lt;br /&gt;
{&lt;br /&gt;
  // Registrace nejsou povoleny&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programování]]&lt;br /&gt;
[[Kategorie:WoW]]&lt;/div&gt;</summary>
		<author><name>Chronos</name></author>
	</entry>
</feed>