Swoole, Php
git clone https://github.com/Watish/WatishWEBcomposer create-project watish/watishweb:dev-masterФайл входа проекта - Project /bin/coserver.php
swoole-cli ./bin/CoServer.php php ./bin/CoServer.php
Создайте новый класс в каталоге SRC/Controller , здесь мы определяем его как HelloController
<?php
namespace Watish WatishWEB Controller ;
use Watish Components Attribute Path ;
use Watish Components Struct Request ;
class HelloController
{
#[Path( ' / ' )]
public function index ( Request $ request ) : array
{
return [
" msg " => " hello world "
];
}
}После сохранения запустите проект и посетите http://127.0.0.1:9502/, чтобы увидеть
{ "msg" : " hello world " }Разве это не очень просто?
В отличие от традиционной формы PHP-FPM, существует изоляция памяти между несколькими процессами , что означает, что переменная процесса B, установленная в процессе A, не может быть извлечена. Кроме того, запрос не изолирован . То есть два запроса в рамках одного и того же процесса, хотя обрабатывается логика обработки в разных кругах, если оба глобальная переменная A изменяются, то глобальная переменная будет изменена дважды.
Для получения подробной информации, пожалуйста, обратитесь к инструкциям по программированию в документе Swoole #Critical Errors
Используйте Watish Components включает в себя контекст , чтобы эффективно избежать вышеуказанных проблем
Контекст -это статический класс, который не только обеспечивает простые методы GET и SET , но также предоставляет Globalset, Globalget и другие методы многоработников процесса глобальных переменных посредством процесса связи.
ПРИМЕЧАНИЕ. Глобальный настройка переменных процессов с несколькими работниками (Context :: Global_set и т. Д.) Реализован асинхронно на основе Unixsocket. Это не может гарантировать согласованность данных в определенный момент. Здесь вы можете использовать Watish Components Utils Table , инкапсулированную таблицу памяти KV для Swoole Table , которая может полностью использовать каждую строку ресурсов и сериализацию закрытия поддержки.
Когда браузер отправляет запрос на сервер, сервер вызовет метод отвода, а затем будет судить, существует ли запрашиваемый маршрут через планировщик маршрутизации. Существуют параметры маршрутизации, инкапсулировать их в Watish Components struct request и передайте их в глобальное промежуточное программное обеспечение-> локальное промежуточное программное обеспечение-> Контроллер
Два способа регистрации маршрутизации
Примечание. Вам необходимо изменить ** register_route_auto ** на true в **/config/server.php **
. . .
" register_route_auto " => true
...Префикс - это аннотация класса , которая определяет префикс маршрута под этим классом.
#[Prefix(string $ prefix )]Путь - это метод аннотация , которая определяет путь маршрутизации
#[Path(string $ path ,array $ methods )]Возьмите каштан:
<?php
namespace Watish WatishWEB Controller ;
use Watish Components Attribute Middleware ;
use Watish Components Attribute Path ;
use Watish Components Attribute Prefix ;
use Watish Components Struct Request ;
use Watish WatishWEB Middleware TestMiddleware ;
#[Prefix( ' /hello ' )]
class HelloController
{
#[Path( ' /index ' )]
public function index ( Request $ request ) : array
{
return [
" msg " => " hello world "
];
}
#[Path( ' /user/{name} ' ,[ ' GET ' , ' POST ' ])]
#[Middleware([TestMiddleware::class])]
public function msg ( Request $ request ) : array
{
return [
" msg " => " hello " . $ request -> route ( ' name ' )
];
}
}Приведенный выше код направляется следующим образом
| путь | Контроллер | метод | промежуточное программное обеспечение |
|---|---|---|---|
| /hello/index | Hellocontroller@index | ЛЮБОЙ | никто |
| /hello/user/{имя} | Hellocontroller@msg | Получить, почта | Testmiddleware |
Путь к файлу конфигурации маршрутизации: project/config/route.php
Повторно используйте вышеуказанные каштаны, затем приведенная выше конфигурация маршрутизации должна быть следующей
<?php
use Watish Components Includes Route ;
use Watish WatishWEB Controller HelloController ;
function do_register_global_middleware ( Route $ route ): void
{
/**
$route->register_global_middleware(CorsMiddleware::class);
*/
}
function do_register_routes ( Route $ route ): void
{
$ route -> register ( ' /hello/index ' ,[HelloController::class, ' index ' ],[],[]);
$ route -> register ( ' /hello/user/{name} ' ,[HelloController::class, ' msg ' ],[TestMiddleware: class ],[ ' GET ' , ' POST ' ]);
}Зарегистрировать метод переноса параметров следующим образом
Watish Components Includes Route-> register (string $ path , array $ callback , array $ before_middlewares , array $ methods )Примечание: промежуточное программное обеспечение должно реализовать интерфейс промежуточного программного обеспечения
Зарегистрироваться по аннотации
Вы можете реализовать глобальную регистрацию промежуточного программного обеспечения с помощью аннотаций GlobalMiddleware Class
Например:
<?php
namespace Watish WatishWEB Middleware ;
use Watish Components Attribute GlobalMiddleware ;
use Watish Components Struct Request ;
use Watish Components Struct Response ;
#[GlobalMiddleware]
class CorsMiddleware implements MiddlewareInterface
{
public function handle ( Request $ request , Response $ response ): void
{
$ response -> header ( " Access-Control-Allow-Origin " , " * " );
$ response -> header ( " Access-Control-Allow-Credentials " , true );
}
}Зарегистрироваться по маршруту
Путь файла конфигурации: project/config/route.php
<?php
use Watish Components Includes Route ;
use Watish WatishWEB Controller HelloController ;
use Watish WatishWEB Middleware CorsMiddleware ;
function do_register_global_middleware ( Route $ route ): void
{
$ route -> register_global_middleware (CorsMiddleware::class);
}
function do_register_routes ( Route $ route ): void
{
$ route -> register ( ' /hello/index ' ,[HelloController::class, ' index ' ],[],[]);
$ route -> register ( ' /hello/user/{name} ' ,[HelloController::class, ' msg ' ],[],[ ' GET ' , ' POST ' ]);
}Зарегистрироваться по аннотации
Вы можете использовать промежуточное программное обеспечение для аннотирования контроллера или метода
#[Middleware(array $ middlewares )]Сначала создайте тестовую носителя
<?php
namespace Watish WatishWEB Middleware ;
use Watish Components Struct Request ;
use Watish Components Struct Response ;
class TestMiddleware implements MiddlewareInterface
{
public function handle ( Request $ request , Response $ response )
{
$ response -> header ( " test " , " test " );
}
}Затем измените HelloController
<?php
namespace Watish WatishWEB Controller ;
use Watish Components Attribute Middleware ;
use Watish Components Attribute Path ;
use Watish Components Attribute Prefix ;
use Watish Components Struct Request ;
use Watish WatishWEB Middleware TestMiddleware ;
#[Prefix( ' /hello ' )]
class HelloController
{
#[Path( ' /index ' )]
#[Middleware([TestMiddleware::class])]
public function index ( Request $ request ) : array
{
return [
" msg " => " hello world "
];
}
#[Path( ' /user/{name} ' ,[ ' GET ' , ' POST ' ])]
#[Middleware([TestMiddleware::class])]
public function msg ( Request $ request ) : array
{
return [
" msg " => " hello " . $ request -> route ( ' name ' )
];
}
}Как упомянуто выше, метод индекса и метод MSG имеют локальное промежуточное программное обеспечение.
Конечно, приведенный выше код может быть написан таким образом, и напрямую добавить аннотации промежуточного программного обеспечения в HelloController
<?php
namespace Watish WatishWEB Controller ;
use Watish Components Attribute Middleware ;
use Watish Components Attribute Path ;
use Watish Components Attribute Prefix ;
use Watish Components Struct Request ;
use Watish WatishWEB Middleware TestMiddleware ;
#[Prefix( ' /hello ' )]
#[Middleware([TestMiddleware::class])]
class HelloController
{
#[Path( ' /index ' )]
public function index ( Request $ request ) : array
{
return [
" msg " => " hello world "
];
}
#[Path( ' /user/{name} ' ,[ ' GET ' , ' POST ' ])]
public function msg ( Request $ request ) : array
{
return [
" msg " => " hello " . $ request -> route ( ' name ' )
];
}
}Зарегистрируйтесь через файл конфигурации
Обратитесь к методу регистрации маршрутизации файлов конфигурации в параметре регистрации разделения маршрутизации, а не подробно здесь
Контроллер является ядром всего бизнес -проекта, ответственным за запросы на обработку, вызовы услуг и возвращение данных
Просто, нет описания
Вместе с инъекцией зависимостей , дайте мне каштан:
<?php
namespace Watish WatishWEB Controller ;
use Watish Components Attribute Inject ;
use Watish Components Attribute Middleware ;
use Watish Components Attribute Path ;
use Watish Components Attribute Prefix ;
use Watish Components Struct Request ;
use Watish WatishWEB Middleware TestMiddleware ;
use Watish WatishWEB Service BaseService ;
#[Prefix( ' /hello ' )]
#[Middleware([TestMiddleware::class])]
class HelloController
{
#[Inject(BaseService::class)]
public BaseService $ baseService ;
#[Path( ' /index ' )]
public function index ( Request $ request ) : array
{
return [
" msg " => $ this -> baseService -> toArray ([ " Hello " , ' World ' ])
];
}
#[Path( ' /user/{name} ' ,[ ' GET ' , ' POST ' ])]
public function msg ( Request $ request ) : array
{
return [
" msg " => " hello " . $ request -> route ( ' name ' )
];
}
}Примечание. Инъекция метода строительства не поддерживается на данный момент, и в будущем она будет улучшена (копание отверстия)
Публиковать код напрямую
<?php
namespace Watish WatishWEB Service ;
use Watish Components Attribute Async ;
use Watish Components Attribute Inject ;
use Watish Components Utils Logger ;
class TestService
{
#[Inject(BaseService::class)]
public BaseService $ baseService ;
#[Async]
public function asyncHello (): void
{
Logger:: info ( " Hello " );
}
public function hello ( string $ name ) : string
{
return " hello { $ name }" ;
}
}В эксплуатации инъекция зависимостей все еще может быть выполнена. Кроме того, метод может быть асинхронным аннотированным (обратите внимание, что метод, аннотированный Async, должен быть пустого типа), чтобы сделать его асинхронным методом
Файлы командных классов хранятся в Project/SRC/Command/
Примечание. Класс команды требует интерфейса CommandInterface реализации
Классы команд могут регистрировать только команды, используя аннотации
Пример кода заключается в следующем:
<?php
namespace Watish WatishWEB Command ;
use Watish Components Attribute Command ;
use Watish Components Utils Logger ;
#[Command( " hello " , " command " )]
class HelloCommand implements CommandInterface
{
public function handle (): void
{
Logger:: info ( " Hello " );
}
}Приведенный выше код может быть выполнен следующим образом
Swoole-Cli
swoole-cli ./bin/CoServer.php command:helloPHP
php ./bin/CoServer.php command:hello
Аннотация использования командования
Command (string $ command , string $ prefix = " command " )Класс заданий хранится в Project/SRC/Task/
Примечание. Все классы задач должны реализовать TaskInterface
Класс заданий поддерживает только регистрацию временных задач с использованием аннотации Crontab .
Пример кода заключается в следующем:
<?php
namespace Watish WatishWEB Task ;
use Watish Components Attribute Crontab ;
use Watish Components Utils Logger ;
#[Crontab( " * * * * * " )]
class HelloTask implements TaskInterface
{
public function execute (): void
{
Logger:: info ( " Hello " , " HelloTask " );
}
}Это временная задача, которая выводит привет каждую секунду
Как использовать аннотацию кронтаба
Crontab (string $ rule )где правило является стандартным выражением Crontab
Примечание: на данный момент есть только MySQL, Redis (может добавить его самостоятельно)
Эта структура использует пулы соединений для поддержания соединений MySQL и Redis, и завершает создание пула соединений в начале запуска. Теперь его нужно использовать только в бизнес -логике.
** Watish Components Inclate Database :: MySQL () ** Возвращает инкапсуляцию конструктора запроса Laravel (в основном изменяя базовую логику PDO, без различия в нормальном использовании)
Watish Components Inclate Database :: Redis () возвращает клиент Predis
Сначала настройте базу данных! Файл конфигурации: Project/config/database.php
Структура использует следующие компоненты и инкапсулирует некоторые компоненты
Под пространством имен конструктора Watish Compontents быстрое построение некоторых компонентов предоставляется
AsynctaskConstructor :: Make () асинхронная доставка задач
LocalFilesyStemConstructor :: getFilesyStem () Локальная файловая система конструктор
ValidatorConstructor :: Make (Array $ Data, Array $ правила) конструктор Validator
Спасибо отличным разработчикам компонентов
Тестовая среда: Ubuntu22.0.4 LTS
Тестирование оборудования: виртуальная машина (VirtualBox) 6C6T, 8192M, включить поддержку виртуализации
Тестовый инструмент: Apachebench
This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 9502
Document Path: /hello/user/test
Document Length: 20 bytes
Concurrency Level: 3000
Time taken for tests: 2.040 seconds
Complete requests: 30000
Failed requests: 0
Total transferred: 7680000 bytes
HTML transferred: 600000 bytes
Requests per second: 14708.19 [#/sec] (mean)
Time per request: 203.968 [ms] (mean)
Time per request: 0.068 [ms] (mean, across all concurrent requests)
Transfer rate: 3677.05 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 83 17.3 85 125
Processing: 32 109 41.6 102 380
Waiting: 0 79 40.0 71 362
Total: 107 193 37.8 189 457
Percentage of the requests served within a certain time (ms)
50% 189
66% 200
75% 205
80% 208
90% 224
95% 236
98% 344
99% 389
100% 457 (longest request)
Примечание: не обращайте слишком много внимания на производительность. Настоящая бизнес -логика часто сложна. Тестирование давления на демонстрации не может ничего указать (картинки)
Если это легко использовать, вы можете нажать на звезду. Если у вас есть какие -либо вопросы, упомяните проблему. Автор будет активно поддерживать это.
Обновлено на 2022-12-28 16:01
Пожалуйста, запустите установку композитора первым