protected function getNextSlave($cb)
{
$that = $this;
$checkSlave = function () use($cb, $that, &$checkSlave) {
$minConnections = null;
$minPort = null;
foreach ($this->slaves as $slave) {
if (!$slave['ready']) {
continue;
}
if (!$this->concurrentRequestsPerWorker && $slave['busy']) {
//we skip workers that are busy, means worker that are currently handle a connection
//this makes it more robust since most applications are not made to handle
//several request at the same time - even when one request is streaming. Would lead
//to strange effects&crashes in high traffic sites if not considered.
//maybe in the future this can be set application specific.
//Rule of thumb: The application may not operate on globals, statics or same file paths to get this working.
continue;
}
// we pick a slave that currently handles the fewest connections
if (null === $minConnections || $slave['connections'] < $minConnections) {
$minConnections = $slave['connections'];
$minPort = $slave['port'];
}
}
if (null !== $minPort) {
$this->handledRequests++;
$cb($minPort);
return;
}
$this->loop->futureTick($checkSlave);
};
$checkSlave();
}