PHP рдорд╛рдЗрдХреНрд░реЛрд╕рд╡рд░реНрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ - рд╕реНрд╡рд┐рдлреНрдЯ


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


Github


https://github.com/swoft-cloud/swoft


рдлрд╝реАрдЪрд░


рдкреВрд░реНрдг coroutine рдврд╛рдВрдЪрд╛


рд╕реНрд╡рд┐рдлреНрдЯ рдкрд╣рд▓реА рдмрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдореЛрд░реА рдореЗрдореЛрд░реА рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдирд┐рд╡рд╛рд╕реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХрдиреНрд╡реЗрдВрд╢рди рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдбрд┐рдЬрд╛рдЗрди рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рдВрд╕ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред


AOP


AOP рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реИ рдЬреЛ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЛрдб рдХреЛ рдбрд┐рдХреВрдк рдХрд░рдиреЗ, рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред


/** * @Aspect(order=1) * @PointBean(include={"App\Http\Controller\TestExecTimeController"}) */ class CalcExecTimeAspect { protected $start; /** * @Before() */ public function before() { $this->start = microtime(true); } /** * @After() */ public function after(JoinPoint $joinPoint) { $method = $joinPoint->getMethod(); $after = microtime(true); $runtime = ($after - $this->start) * 1000; echo "{$method} cost: {$runtime}ms\n"; } } 

Http рд╕реЗрд╡рд╛


Http рд╕реЗрд╡рд╛ рд╕рд░рд▓ рдФрд░ рд▓рдЪреАрд▓реА рд╣реИ, рдХреЗрд╡рд▓ рд╕реЗрд╡рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @Controller() рдФрд░ @RequestMapping(route="index") рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


 /** * @Controller() */ class IndexController { /** * @RequestMapping(route="index") */ public function index(): string { return "test"; } } 

рд╡реЗрдмрд╕реЛрдХреЗрдЯ рд╕реЗрд╡рд╛


Swoft рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реЗрдмрд╕реИрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рдЬрд▓реНрджреА рд╕реЗ рд╕реЗрд╡рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХреЗ


 /** * @WsModule( * "/chat", * messageParser=TokenTextParser::class, * controllers={HomeController::class} * ) */ class ChatModule { /** * @OnOpen() * @param Request $request * @param int $fd */ public function onOpen(Request $request, int $fd): void { server()->push($request->getFd(), "Opened, welcome!(FD: $fd)"); } } 

рдЖрд░рдкреАрд╕реА рд╕реЗрд╡рд╛


Swoft RPC рдХреЛ рдбреЛрдмреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдореВрд▓ рдХрд╛рд░реНрдп рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 /** * @Controller() */ class RpcController { /** * @Reference(pool="user.pool", version="1.0") * * @var UserInterface */ private $userService; /** * @RequestMapping("getList") * * @return array */ public function getList(): array { $result = $this->userService->getList(12, 'type'); return [$result]; } } 

рдЯреАрд╕реАрдкреА рд╕реЗрд╡рд╛


Swoft рднреА рд╕реБрд╡рд┐рдзрд╛ рд╕рдВрдкрдиреНрди TCP рд╕реЗрд╡рд╛ рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


 <?php declare(strict_types=1); namespace App\Tcp\Controller; use Swoft\Tcp\Server\Annotation\Mapping\TcpController; use Swoft\Tcp\Server\Annotation\Mapping\TcpMapping; use Swoft\Tcp\Server\Request; use Swoft\Tcp\Server\Response; /** * Class DemoController * * @TcpController() */ class DemoController { /** * @TcpMapping("echo", root=true) * @param Request $request * @param Response $response */ public function echo(Request $request, Response $response): void { // $str = $request->getRawData(); $str = $request->getPackage()->getDataString(); $response->setData('[echo]hi, we received your message: ' . $str); } } 

рдХрдиреЗрдХреНрд╢рди рдкреВрд▓


Swoft рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ:


 return [ 'xxx.pool' => [ 'class' => \Swoft\xxx\Pool::class, 'minActive' => 10, 'maxActive' => 20, 'maxWait' => 0, 'maxWaitTime' => 0, 'maxIdleTime' => 60, ] ]; 

рд▓рд╛рд░рд╡реЗрд▓ рдУрдЖрд░рдПрдо рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд


Swoft рдбреЗрдЯрд╛рдмреЗрд╕, Laravel ORM рдХреЗ рд╕рд╛рде рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрдЧрдд рд╣реИ, PHP рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП Swoft рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред


 // Model $user = User::new(); $user->setName('name'); $user->setSex(1); $user->setDesc('this my desc'); $user->setAge(mt_rand(1, 100)); $user->save(); $id = $user->getId(); // Query $users = DB::table('user')->get(); foreach ($users as $user) { echo $user->name; } // Transaction B::beginTransaction(); $user = User::find($id); $user->update(['name' => $id]); DB::beginTransaction(); User::find($id)->update(['name'=>'sakuraovq']); DB::rollBack(); DB::commit(); 

Microservice


рд╕реНрд╡рд┐рдлреНрдЯ рддреНрд╡рд░рд┐рдд рдмрд┐рд▓реНрдб рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рд╢рд╛рд╕рди рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред


  • рд╕реЗрд╡рд╛ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдЦреЛрдЬ
  • рд╕реЗрд╡рд╛ рджрд▓рд╛рд▓
  • рдХреЗрдВрджреНрд░реАрдХреГрдд рд╡рд┐рдиреНрдпрд╛рд╕
  • рд╕реЗрд╡рд╛ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдХреНрд╖рдорддрд╛

 /** * @Bean() */ class Test { /** * @Breaker(fallback="funcFallback") * * @return string * @throws Exception */ public function func(): string { // Do something throw new Exception('Breaker exception'); } /** * @RequestMapping() * @RateLimiter(key="request.getUriPath()") * * @param Request $request * * @return array */ public function requestLimiter(Request $request): array { $uri = $request->getUriPath(); return ['requestLimiter', $uri]; } } 

Github


https://github.com/swoft-cloud/swoft


рдмреЗрдВрдЪрдорд╛рд░реНрдХ


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


All Articles