Evaluating Swoft — A PHP Microservices Framework

Written by inhere | Published 2019/08/21
Tech Story Tags: php | microservice | micro-service | golang | swoft | laravel | framework | latest-tech-stories

TLDR Swoft is a PHP high performance microservice co-routine framework. It has been published for many years and has become the best choice for PHP. It can be like Go and is resident in memory independent of traditional PHP-FPM. There are similar Go language operations, similar to the Spring Cloud framework flexible annotations. It is compatible with Laravel ORM, It’s easy for PHP developer to use in Swoft. It's easy to define a high-performance connection pool with like this:via the TL;DR App

Swoft is a PHP high performance microservice co-routine framework.
It has been published for many years and has become the best choice for php. It can be like Go, built-in co-routine web server and common co-routine client and is resident in memory, independent of traditional PHP-FPM.
There are similar Go language operations, similar to the Spring Cloud framework flexible annotations.

Github

Feature

Full Co-routine Framework

Swoft is first PHP resident in memory annotation framework, with Spring Boot conventions larger than the configuration design concept, with a set of development specifications.

AOP

AOP is an object oriented programming that makes it easier to decouple business code, improve code quality, and increase code reusability.
/**
 * @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 Service

Http service is simple and flexible, only to use @Controller() and @RequestMapping(route="index") annotations to define service.
/**
 * @Controller()
 */
class IndexController
{
    /**
     * @RequestMapping(route="index")
     */
    public function index(): string
    {
        return "test";
    }
}

WebSocket service

Swoft provides a complete Websocket for developers to quickly build service
/**
 * @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)");
    }
}

RPC Service

Swoft RPC can be called like a native function as Dubbo.
/**
 * @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];
    }
}

TCP Service

Swoft also provides feature-rich TCP service support.
<?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);
    }
}

Connection pool

Swoft is simple to define a high-performance connection pool with like this:
return [
    'xxx.pool' => [
        'class'       => \Swoft\xxx\Pool::class,
        'minActive'   => 10,
        'maxActive'   => 20,
        'maxWait'     => 0,
        'maxWaitTime' => 0,
        'maxIdleTime' => 60,
    ]
];

Compatible with Laravel ORM

Swoft database is highly compatible with Laravel ORM, It’s easy for PHP developer to use in 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
DB::beginTransaction();
$user = User::find($id);
$user->update(['name' => $id]);

DB::beginTransaction();
User::find($id)->update(['name'=>'sakuraovq']);
DB::rollBack();

DB::commit();

Microservice

Swoft provides a set of quick build microservice governance components, it’s easy for developers to use.
Service Registration and DiscoveryService BrokerCentralized ConfigurationService Throttling ability
/**
 * @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


Written by inhere | PHP & Go developer
Published by HackerNoon on 2019/08/21