swoole, php
git clone https://github.com/Watish/WatishWEBcomposer create-project watish/watishweb:dev-masterไฟล์รายการของโครงการคือโครงการ /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 ไม่สามารถเรียกคืนได้ นอกจากนี้ คำขอไม่ได้แยก กล่าวคือสองคำขอภายใต้กระบวนการเดียวกันแม้ว่าตรรกะการประมวลผลใน coroutines ที่แตกต่างกันจะถูกประมวลผลหากตัวแปรทั่วโลกทั้งสองถูกแก้ไขแล้วตัวแปรส่วนกลางจะถูกแก้ไขสองครั้ง
สำหรับรายละเอียดโปรดดู คำแนะนำการเขียนโปรแกรม ในเอกสาร Swoole #ข้อผิดพลาดที่สำคัญ
ใช้ WATISH Components รวมถึง บริบท เพื่อหลีกเลี่ยงปัญหาข้างต้นได้อย่างมีประสิทธิภาพ
บริบท เป็นคลาสแบบคงที่ที่ไม่เพียง แต่ให้วิธี การรับ และ การตั้งค่า ที่ง่าย แต่ยังมี Globalset, GlobalGet และวิธีการอื่น ๆ ของตัวแปรทั่วโลก หลายคน ผ่านการสื่อสารกระบวนการ
หมายเหตุ: การตั้งค่าตัวแปรทั่วโลกหลายกระบวนการ (บริบท :: global_set ฯลฯ ) ถูกนำมาใช้แบบอะซิงโครนัสตาม UnixSocket ไม่สามารถรับประกันความสอดคล้องของข้อมูลในช่วงเวลาหนึ่ง ที่นี่คุณสามารถใช้ WATISH Components Utils Table ตารางหน่วยความจำ KV ที่ห่อหุ้มสำหรับ Swoole Table ซึ่งสามารถใช้ประโยชน์จากทรัพยากรแต่ละแถวและรองรับการปิดอนุกรม
เมื่อเบราว์เซอร์ส่งคำขอไปยังเซิร์ฟเวอร์เซิร์ฟเวอร์จะเรียกวิธีการจัดการแล้วตัดสินว่าเส้นทางที่ร้องขอนั้นมีอยู่ผ่านตัวกำหนดตารางเวลาการกำหนดเส้นทางหรือไม่ พารามิเตอร์การกำหนดเส้นทางมีอยู่ห่อหุ้มพวกเขาไปยัง WATISH Components struct Request และส่งผ่านไปยัง มิดเดิลแวร์ทั่วโลก-> ตัวมิดเดิลแวร์ในท้องถิ่น-> คอนโทรลเลอร์
สองวิธีในการลงทะเบียนการกำหนดเส้นทาง
หมายเหตุ: คุณต้องแก้ไข ** register_route_auto ** เป็น จริง ใน **/config/server.php **
. . .
" register_route_auto " => true
...คำนำหน้า เป็น คำอธิบายประกอบคลาส ที่กำหนดคำนำหน้าของเส้นทางภายใต้ชั้นเรียนนี้
#[Prefix(string $ prefix )]Path เป็น คำอธิบายประกอบวิธีการ ที่กำหนดเส้นทางการกำหนดเส้นทาง
#[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 ' )
];
}
}รหัสข้างต้นถูกกำหนดเส้นทางดังนี้
| เส้นทาง | ผู้ควบคุม | วิธี | มิดเดิลแวร์ |
|---|---|---|---|
| /สวัสดี/ดัชนี | hellocontroller@index | ใดๆ | ไม่มี |
| /hello/user/{name} | hellocontroller@msg | รับโพสต์ | testmiddleware |
พา ธ ไปยังไฟล์กำหนดค่าการกำหนดเส้นทางคือ: โครงการ/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
ตัวอย่างเช่น:
<?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 )]สร้าง testmiddleware ก่อน
<?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 ' )
];
}
}ดังที่ได้กล่าวไว้ข้างต้นวิธีการดัชนีและวิธีการผงชูรสมีมิดเดิลแวร์ testmiddleware ท้องถิ่น
แน่นอนรหัสข้างต้นสามารถเขียนได้เช่นนี้และเพิ่มคำอธิบายประกอบ มิดเดิลแวร์ โดยตรงไปยัง 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 ต้องเป็นโมฆะประเภท) เพื่อให้เป็นวิธีการแบบอะซิงโครนัส
ไฟล์คลาสคำสั่งจะถูกเก็บไว้ใน โครงการ/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 " )คลาสงานจะถูกเก็บไว้ใน โครงการ/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
Crontab (string $ rule )โดยที่กฎคือ นิพจน์ crontab มาตรฐาน
หมายเหตุ: มี MySQL เท่านั้นในขณะนี้ Redis (สามารถเพิ่มด้วยตัวคุณเอง)
เฟรมเวิร์กนี้ใช้พูลการเชื่อมต่อเพื่อรักษาการเชื่อมต่อ MySQL และ REDIS และเสร็จสิ้นการสร้างพูลการเชื่อมต่อที่จุดเริ่มต้นของการเริ่มต้น ตอนนี้ต้องใช้ในตรรกะทางธุรกิจเท่านั้น
** WATISH Components รวม database :: mysql () ** ส่งคืนการห่อหุ้มของตัวสร้างการสืบค้น laravel (ส่วนใหญ่เปลี่ยนตรรกะ PDO พื้นฐานไม่มีความแตกต่างในการใช้งานปกติ)
WATISH Components รวม database :: redis () ส่งคืนไคลเอนต์ predis
โปรดกำหนดค่าฐานข้อมูลก่อน! ไฟล์กำหนดค่า: โครงการ/config/database.php
เฟรมเวิร์กใช้ส่วนประกอบต่อไปนี้และห่อหุ้มส่วนประกอบบางส่วน
ภายใต้เนมสเปซของ WATISH CONSTRUCTOR จะมีการสร้างส่วนประกอบอย่างรวดเร็ว
AsyncTaskConstructor :: Make () การส่งมอบงานแบบอะซิงโครนัส
localfilesystemconstructor :: getFilesystem () ตัวสร้างระบบไฟล์ท้องถิ่น
ValidatorConstructor :: Make (Array $ data, Array $ กฎ) ตัวสร้างความถูกต้อง
ขอบคุณผู้พัฒนาองค์ประกอบที่ยอดเยี่ยม
สภาพแวดล้อมการทดสอบ: 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
โปรดเรียกใช้ Composer Install ก่อน