1. Go to this page and download the library: Download utopia-php/balancing library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
topia\Balancer\Algorithm\RoundRobin;
use Utopia\Balancer\Balancer;
use Utopia\Balancer\Option;
$atomic = new Atomic(-1); // Some atomic implementation, for example: https://openswoole.com/docs/modules/swoole-atomic
function onRequest() {
$lastIndex = $atomic->get();
$algo = new RoundRobin($lastIndex);
$balancer = new Balancer();
$balancer->addFilter(fn (Option $option) => $option->getState('online', false) === true);
$balancer
->addOption(new Option([ 'dataCenter' => 'fra-1' ]))
->addOption(new Option([ 'dataCenter' => 'fra-2' ]))
->addOption(new Option([ 'dataCenter' => 'lon-1' ]));
var_dump($balancer->run());
$atomic->cmpset($lastIndex, $algo->getIndex());
}
topia\Balancer\Algorithm\First;
use Utopia\Balancer\Balancer;
use Utopia\Balancer\Group;
use Utopia\Balancer\Option;
// Prepare options where each has high CPU load
$options = [
new Option([ 'dataCenter' => 'fra-1', 'cpu' => 91 ]),
new Option([ 'dataCenter' => 'fra-2', 'cpu' => 95 ]),
new Option([ 'dataCenter' => 'lon-1', 'cpu' => 87 ]),
];
// Prepare balancer that allows only low CPU load options
$balancer1 = new Balancer(new First());
$balancer1->addFilter(fn ($option) => $option->getState('cpu') < 80);
// Prepare balancer that allows all options
$balancer2 = new Balancer(new First());
// Add options to both balancers
foreach ($options as $option) {
$balancer1->addOption($option);
$balancer2->addOption($option);
}
// Prepare group with both balancers
$group = new Group();
$group
->add($balancer1)
->add($balancer2);
// Run group to get option
$option = $group->run() ?? new Option([]);
\var_dump($option);
// We got fra-1 option. First balancer filtered out all options, but second balancer allowed any, and First algorithm picked first option
bash
composer
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.