仓库初始化
This commit is contained in:
79
addons/epay/library/hyperf/utils/src/Channel/Caller.php
Normal file
79
addons/epay/library/hyperf/utils/src/Channel/Caller.php
Normal file
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* This file is part of Hyperf.
|
||||
*
|
||||
* @link https://www.hyperf.io
|
||||
* @document https://hyperf.wiki
|
||||
* @contact group@hyperf.io
|
||||
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
|
||||
*/
|
||||
namespace Hyperf\Utils\Channel;
|
||||
|
||||
use Closure;
|
||||
use Hyperf\Engine\Channel;
|
||||
use Hyperf\Utils\Exception\ChannelClosedException;
|
||||
use Hyperf\Utils\Exception\WaitTimeoutException;
|
||||
|
||||
class Caller
|
||||
{
|
||||
/**
|
||||
* @var null|Channel
|
||||
*/
|
||||
protected $channel;
|
||||
|
||||
/**
|
||||
* @var float wait seconds
|
||||
*/
|
||||
protected $waitTimeout;
|
||||
|
||||
/**
|
||||
* @var null|Closure
|
||||
*/
|
||||
protected $closure;
|
||||
|
||||
public function __construct(Closure $closure, float $waitTimeout = 10)
|
||||
{
|
||||
$this->closure = $closure;
|
||||
$this->waitTimeout = $waitTimeout;
|
||||
$this->initInstance();
|
||||
}
|
||||
|
||||
public function call(Closure $closure)
|
||||
{
|
||||
$release = true;
|
||||
$channel = $this->channel;
|
||||
try {
|
||||
$instance = $channel->pop($this->waitTimeout);
|
||||
if ($instance === false) {
|
||||
if ($channel->isClosing()) {
|
||||
throw new ChannelClosedException('The channel was closed.');
|
||||
}
|
||||
|
||||
if ($channel->isTimeout()) {
|
||||
throw new WaitTimeoutException('The instance pop from channel timeout.');
|
||||
}
|
||||
}
|
||||
|
||||
$result = $closure($instance);
|
||||
} catch (ChannelClosedException|WaitTimeoutException $exception) {
|
||||
$release = false;
|
||||
throw $exception;
|
||||
} finally {
|
||||
$release && $channel->push($instance ?? null);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function initInstance(): void
|
||||
{
|
||||
if ($this->channel) {
|
||||
$this->channel->close();
|
||||
}
|
||||
|
||||
$this->channel = new Channel(1);
|
||||
$this->channel->push($this->closure->__invoke());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* This file is part of Hyperf.
|
||||
*
|
||||
* @link https://www.hyperf.io
|
||||
* @document https://hyperf.wiki
|
||||
* @contact group@hyperf.io
|
||||
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
|
||||
*/
|
||||
namespace Hyperf\Utils\Channel;
|
||||
|
||||
use Hyperf\Engine\Channel;
|
||||
|
||||
class ChannelManager
|
||||
{
|
||||
/**
|
||||
* @var Channel[]
|
||||
*/
|
||||
protected $channels = [];
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
protected $size = 1;
|
||||
|
||||
public function __construct(int $size = 1)
|
||||
{
|
||||
$this->size = $size;
|
||||
}
|
||||
|
||||
public function get(int $id, bool $initialize = false): ?Channel
|
||||
{
|
||||
if (isset($this->channels[$id])) {
|
||||
return $this->channels[$id];
|
||||
}
|
||||
|
||||
if ($initialize) {
|
||||
return $this->channels[$id] = $this->make($this->size);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function make(int $limit): Channel
|
||||
{
|
||||
return new Channel($limit);
|
||||
}
|
||||
|
||||
public function close(int $id): void
|
||||
{
|
||||
if ($channel = $this->channels[$id] ?? null) {
|
||||
$channel->close();
|
||||
}
|
||||
|
||||
unset($this->channels[$id]);
|
||||
}
|
||||
|
||||
public function getChannels(): array
|
||||
{
|
||||
return $this->channels;
|
||||
}
|
||||
|
||||
public function flush(): void
|
||||
{
|
||||
$channels = $this->getChannels();
|
||||
foreach ($channels as $id => $channel) {
|
||||
$this->close($id);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user