antidot-fw/reactive-starter

响应式 Antidot 框架应用程序启动器


README

link-packagist

此框架基于其他开源软件的概念和组件,特别是 Zend ExpressiveZend StratigillityRecoilReact PHP

安装

使用 composer 包管理器安装项目

composer create-project antidot-fw/reactive-starter dev
mv dev/.* dev/* ./ && rmdir dev
bin/console server:run

在浏览器中打开本地主机上的端口 5555,您将看到 DriftPHP Server 正在运行。

配置

服务器配置

默认配置

parameters:
    server:
      host: '0.0.0.0'
      port: '5555'
      max_concurrency: 100
      buffer_size: 4096
      workers: 4

开发模式

要运行开发模式,您可以运行 config:development-mode 命令

bin/console config:development-mode

或者您可以手动重命名从 config/services/dependencies.dev.yaml.distconfig/services/dependencies.dev.yaml

mv config/services/dependencies.dev.yaml.dist config/services/dependencies.dev.yaml

热代码重新加载

composer require seregazhuk/php-watcher --dev

您可以使用 Php whatcher 与 composer 进行更友好的开发。

bin/console server:watch

Default homepage

在另一个控制台中检查内置的 CLI 工具

bin/console

Default console tool

异步使用

它允许在 PSR-15 和 PSR-7 中间件和请求处理器中执行承诺

PSR-15 中间件

<?php
declare(strict_types = 1);

namespace App;

use Antidot\React\PromiseResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class SomeMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        return new PromiseResponse(
            resolve($request)->then(static fn(ServerrequestInsterface $request) => $handler->handle($request))
        );
    }
}

PSR-7 请求处理器

<?php
declare(strict_types = 1);

namespace App;

use Antidot\React\PromiseResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

class SomeMiddleware implements RequestHandlerInterface
{
    public function process(ServerRequestInterface $request): ResponseInterface
    {
        return resolve($request)->then(
            function(ServerrequestInterface $request): ResponseInterface {
                return new Response('Hello World!!!');
            }
        );;
    }
}

经典使用

它允许执行经典的 PSR-15 中间件和请求处理器

PSR-15 中间件

<?php
declare(strict_types = 1);

namespace App;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class SomeMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        return $handler->handle($request);
    }
}

PSR-7 请求处理器

<?php
declare(strict_types = 1);

namespace App;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

class SomeMiddleware implements RequestHandlerInterface
{
    public function process(ServerRequestInterface $request): ResponseInterface
    {
        return new Response('Hello World!!!');
    }
}

基准测试

使用 apache ab 单线程

> ab -n 40000 -c 64 http://127.0.0.1:8080/ 
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, https://apache.ac.cn/

Benchmarking 127.0.0.1 (be patient)

Server Software:        ReactPHP/1
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /
Document Length:        96 bytes

Concurrency Level:      64
Time taken for tests:   16.201 seconds
Complete requests:      40000
Failed requests:        0
Total transferred:      8960000 bytes
HTML transferred:       3840000 bytes
Requests per second:    2468.93 [#/sec] (mean)
Time per request:       25.922 [ms] (mean)
Time per request:       0.405 [ms] (mean, across all concurrent requests)
Transfer rate:          540.08 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:    15   26   1.4     25      33
Waiting:       15   26   1.4     25      33
Total:         16   26   1.4     25      33

Percentage of the requests served within a certain time (ms)
  50%     25
  66%     25
  75%     26
  80%     26
  90%     27
  95%     29
  98%     31
  99%     32
 100%     33 (longest request)

使用 wrk

> wrk -t8 -c64 -d15s http://127.0.0.1:8080/                                                                                                                                                                                                         [95ba8e6]
Running 15s test @ http://127.0.0.1:8080/
  8 threads and 64 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    26.14ms    1.44ms  34.63ms   92.76%
    Req/Sec   306.84     24.52   373.00     81.17%
  36670 requests in 15.04s, 8.50MB read
Requests/sec:   2437.45
Transfer/sec:    578.42KB

The Benchmarker - Web Framework 项目中查看排名。