
Swoft рдХреНрдпрд╛ рд╣реИ?
рд╕реНрд╡рд┐рдлреНрдЯ рд╕реНрд╡реЛрд▓реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ PHP рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛрд░рдЯрд╛рдЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдЧреЛ рдХреА рддрд░рд╣, Swoft рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд coroutine рд╡реЗрдм рд╕рд░реНрд╡рд░ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп coroutine рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ рдФрд░ рдпрд╣ рдкрд╛рд░рдВрдкрд░рд┐рдХ PHP-FPM рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдирд┐рд╡рд╛рд╕реА рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рдЪреАрд▓реЗ рдПрдиреЛрдЯреЗрд╢рди, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрдВрдЯреЗрдирд░, рд╡реНрдпрд╛рдкрдХ рд╕реЗрд╡рд╛ рд╢рд╛рд╕рди, рд▓рдЪреАрд▓рд╛ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдУрдкреА, рдорд╛рдирдХ рдкреАрдПрд╕рдЖрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕рдорд╛рди рдЧреЛ рднрд╛рд╖рд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВред
рддреАрди рд╡рд░реНрд╖реЛрдВ рдХреЗ рд╕рдВрдЪрдп рдФрд░ рджрд┐рд╢рд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, Swoft рдиреЗ PHP рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдХреЛ рд╕реНрд╡рд┐рдлреНрдЯ рдмрдирд╛рдпрд╛ рд╣реИ, рдЬреЛ PHP рдХреЗ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдврд╛рдВрдЪреЗ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕реЗрд╡рд╛ рд╢рд╛рд╕рди
Swoft рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╕рд╛рдп рдФрд░ рд╕реЗрд╡рд╛ рд╢рд╛рд╕рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рд░реНрд╡рд┐рд╕ рдореЗрд╢ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ Istio / Envoy рдлреНрд░реЗрдорд╡рд░реНрдХ, рд▓реЗрдХрд┐рди Swoft рднреА рдЫреЛрдЯреЗ рдФрд░ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╕рд╛рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд░реНрд╡рд░ рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдЬрд▓реНрджреА рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрдлрд╝рд┐рд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХреЗрдВред
рд╕реЗрд╡рд╛ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдЦреЛрдЬ
рд╕реЗрд╡рд╛ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЕрдиреНрдп рддреГрддреАрдп рдкрдХреНрд╖ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ Swoft рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ Swoft -consul рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдкрдВрдЬреАрдХрд░рдг рдФрд░ рд░рджреНрджреАрдХрд░рдг рд╕реЗрд╡рд╛рдПрдВ
SwooleEvent::START
рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реБрдиреЛ, рд╕реЗрд╡рд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ
class RegisterServiceListener implements EventHandlerInterface { private $agent; public function handle(EventInterface $event): void { $httpServer = $event->getTarget(); $service = [
SwooleEvent::SHUTDOWN
рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрдиреЛ, рд╕реЗрд╡рд╛ рд░рджреНрдж рдХрд░реЗрдВ
class DeregisterServiceListener implements EventHandlerInterface { private $agent; public function handle(EventInterface $event): void { $httpServer = $event->getTarget(); $scheduler = Swoole\Coroutine\Scheduler(); $scheduler->add(function () use ($httpServer) { $this->agent->deregisterService('swoft'); }); $scheduler->start(); } }
рд╕реЗрд╡рд╛ рдЦреЛрдЬ
рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛
class RpcProvider implements ProviderInterface { private $agent; public function getList(Client $client): array {
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛
return [ 'user' => [ 'class' => ServiceClient::class, 'provider' => bean(RpcProvider::class)
рд╕реЗрд╡рд╛ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛
Swoft рдПрдХ рдЭрдЯрдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @Breaker
рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдкрд░ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
class BreakerLogic { public function func(): string {
рд╕реЗрд╡рд╛ рдХреА рд╕реАрдорд╛
Swoft, рд╕рд░реНрд╡рд┐рд╕ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @RateLimiter
рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдкрд░ рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рд╣реА рдереНрд░реЙрдЯрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ KEY рднреА рд╕рд┐рдореНрдлрдиреА / рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рднрд╛рд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
class LimiterController { public function requestLimiter(Request $request): array { $uri = $request->getUriPath(); return ['requestLimiter', $uri]; } public function limiterFallback(Request $request): array { $uri = $request->getUriPath(); return ['limiterFallback', $uri]; } }
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗрдВрджреНрд░
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗрдВрджреНрд░ рдХреЛ Swoft- рдЕрдкреЛрд▓реЛ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ Swoft рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЕрдиреНрдп рддреГрддреАрдп рдкрдХреНрд╖ рд╕рдорд╛рди рд╣реИрдВред
рдПрдЬреЗрдВрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
class AgentCommand { private $config; public function index(): void { $namespaces = [ 'application' ]; while (true) { try { $this->config->listen($namespaces, [$this, 'updateConfigFile']); } catch (Throwable $e) { CLog::error('Config agent fail(%s %s %d)!', $e->getMessage(), $e->getFile(), $e->getLine()); } } } public function updateConfigFile(array $data): void { foreach ($data as $namespace => $namespaceData) { $configFile = sprintf('@config/%s.php', $namespace); $configKVs = $namespaceData['configurations'] ?? ''; $content = '<?php return ' . var_export($configKVs, true) . ';'; Co::writeFile(alias($configFile), $content, FILE_NO_DEFAULT_CONTEXT); CLog::info('Apollo update successя╝Б'); $server = bean('httpServer'); $server->restart(); } } }
рдПрдЬреЗрдВрдЯ рд╢реБрд░реВ рдХрд░реЗрдВ
рдПрдЬреЗрдВрдЯ рдХреЛ рд╕реЗрд╡рд╛ (Http / RPC / Websocket) рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
php bin/swoft agent:index
рд╕рдВрд╕рд╛рдзрди