仓库初始化

This commit is contained in:
2025-08-13 10:43:56 +08:00
commit e8f9b46680
5180 changed files with 859303 additions and 0 deletions

View 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());
}
}

View File

@@ -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);
}
}
}