PHP рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ - Swoft 2.0.3 рдкреНрд░рдХрд╛рд╢рд┐рдд

рдЫрд╡рд┐


Swoft рдХреНрдпрд╛ рд╣реИ?


рд╕реНрд╡рд┐рдлреНрдЯ рд╕реНрд╡реЛрд▓реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ PHP рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЛрд░рдЯрд╛рдЗрди рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рдЧреЛ рдХреА рддрд░рд╣, Swoft рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд coroutine рд╡реЗрдм рд╕рд░реНрд╡рд░ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп coroutine рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ рдФрд░ рдпрд╣ рдкрд╛рд░рдВрдкрд░рд┐рдХ PHP-FPM рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдирд┐рд╡рд╛рд╕реА рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рдЪреАрд▓реЗ рдПрдиреЛрдЯреЗрд╢рди, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡реИрд╢реНрд╡рд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрдВрдЯреЗрдирд░, рд╡реНрдпрд╛рдкрдХ рд╕реЗрд╡рд╛ рд╢рд╛рд╕рди, рд▓рдЪреАрд▓рд╛ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдУрдкреА, рдорд╛рдирдХ рдкреАрдПрд╕рдЖрд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕рдорд╛рди рдЧреЛ рднрд╛рд╖рд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВред


рддреАрди рд╡рд░реНрд╖реЛрдВ рдХреЗ рд╕рдВрдЪрдп рдФрд░ рджрд┐рд╢рд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, Swoft рдиреЗ PHP рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб рдХреЛ рд╕реНрд╡рд┐рдлреНрдЯ рдмрдирд╛рдпрд╛ рд╣реИ, рдЬреЛ PHP рдХреЗ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдврд╛рдВрдЪреЗ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрдореНрд╕ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред


рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕реЗрд╡рд╛ рд╢рд╛рд╕рди


Swoft рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╕рд╛рдп рдФрд░ рд╕реЗрд╡рд╛ рд╢рд╛рд╕рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рд░реНрд╡рд┐рд╕ рдореЗрд╢ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ Istio / Envoy рдлреНрд░реЗрдорд╡рд░реНрдХ, рд▓реЗрдХрд┐рди Swoft рднреА рдЫреЛрдЯреЗ рдФрд░ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреЗ рд╡реНрдпрд╡рд╕рд╛рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд░реНрд╡рд░ рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдЬрд▓реНрджреА рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрдлрд╝рд┐рд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХреЗрдВред



рд╕реЗрд╡рд╛ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдЦреЛрдЬ


рд╕реЗрд╡рд╛ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЕрдиреНрдп рддреГрддреАрдп рдкрдХреНрд╖ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ Swoft рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ Swoft -consul рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рдкрдВрдЬреАрдХрд░рдг рдФрд░ рд░рджреНрджреАрдХрд░рдг рд╕реЗрд╡рд╛рдПрдВ


SwooleEvent::START рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реБрдиреЛ, рд╕реЗрд╡рд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ


 /** * Class RegisterServiceListener * * @since 2.0 * * @Listener(event=SwooleEvent::START) */ class RegisterServiceListener implements EventHandlerInterface { /** * @Inject() * * @var Agent */ private $agent; /** * @param EventInterface $event */ public function handle(EventInterface $event): void { /* @var HttpServer $httpServer */ $httpServer = $event->getTarget(); $service = [ // .... ]; $scheduler = Swoole\Coroutine\Scheduler(); $scheduler->add(function () use ($service) { // Register $this->agent->registerService($service); CLog::info('Swoft http register service success by consul!'); }); $scheduler->start(); } } 

SwooleEvent::SHUTDOWN рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрдиреЛ, рд╕реЗрд╡рд╛ рд░рджреНрдж рдХрд░реЗрдВ


 /** * Class DeregisterServiceListener * * @since 2.0 * * @Listener(SwooleEvent::SHUTDOWN) */ class DeregisterServiceListener implements EventHandlerInterface { /** * @Inject() * * @var Agent */ private $agent; /** * @param EventInterface $event */ public function handle(EventInterface $event): void { /* @var HttpServer $httpServer */ $httpServer = $event->getTarget(); $scheduler = Swoole\Coroutine\Scheduler(); $scheduler->add(function () use ($httpServer) { $this->agent->deregisterService('swoft'); }); $scheduler->start(); } } 

рд╕реЗрд╡рд╛ рдЦреЛрдЬ


рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛


 /** * Class RpcProvider * * @since 2.0 * * @Bean() */ class RpcProvider implements ProviderInterface { /** * @Inject() * * @var Agent */ private $agent; /** * @param Client $client * * @return array * @example * [ * 'host:port' * ] */ public function getList(Client $client): array { // Get health service from consul $services = $this->agent->services(); $services = [ ]; return $services; } } 

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рддрд╛


 return [ 'user' => [ 'class' => ServiceClient::class, 'provider' => bean(RpcProvider::class) // ... ] ]; 

рд╕реЗрд╡рд╛ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛


Swoft рдПрдХ рдЭрдЯрдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @Breaker рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдкрд░ рдЙрдбрд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 /** * Class BreakerLogic * * @since 2.0 * * @Bean() */ class BreakerLogic { /** * @Breaker(fallback="funcFallback") * * @return string * @throws Exception */ public function func(): string { // Do something throw new Exception('Breaker exception'); } /** * @return string */ public function funcFallback(): string { return 'funcFallback'; } } 

рд╕реЗрд╡рд╛ рдХреА рд╕реАрдорд╛


Swoft, рд╕рд░реНрд╡рд┐рд╕ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @RateLimiter рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ рдкрд░ рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рд╣реА рдереНрд░реЙрдЯрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ KEY рднреА рд╕рд┐рдореНрдлрдиреА / рдПрдХреНрд╕рдкреНрд░реЗрд╢рди-рднрд╛рд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред


 /** * Class LimiterController * * @since 2.0 * * @Controller(prefix="limiter") */ class LimiterController { /** * @RequestMapping() * @RateLimiter(key="request.getUriPath()", fallback="limiterFallback") * * @param Request $request * * @return array */ public function requestLimiter(Request $request): array { $uri = $request->getUriPath(); return ['requestLimiter', $uri]; } /** * @param Request $request * * @return array */ public function limiterFallback(Request $request): array { $uri = $request->getUriPath(); return ['limiterFallback', $uri]; } } 

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗрдВрджреНрд░


рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗрдВрджреНрд░ рдХреЛ Swoft- рдЕрдкреЛрд▓реЛ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ Swoft рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЕрдиреНрдп рддреГрддреАрдп рдкрдХреНрд╖ рд╕рдорд╛рди рд╣реИрдВред


рдПрдЬреЗрдВрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ


 /** * Class AgentCommand * * @since 2.0 * * @Command("agent") */ class AgentCommand { /** * @Inject() * * @var Config */ private $config; /** * @CommandMapping(name="index") */ 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()); } } } /** * @param array $data * * @throws ContainerException * @throws ReflectionException */ 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я╝Б'); /** @var HttpServer $server */ $server = bean('httpServer'); $server->restart(); } } } 

рдПрдЬреЗрдВрдЯ рд╢реБрд░реВ рдХрд░реЗрдВ


рдПрдЬреЗрдВрдЯ рдХреЛ рд╕реЗрд╡рд╛ (Http / RPC / Websocket) рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 php bin/swoft agent:index 

рд╕рдВрд╕рд╛рдзрди


Source: https://habr.com/ru/post/hi460147/


All Articles