سوول ، 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. بالإضافة إلى ذلك ، لا يتم عزل الطلب . بمعنى أن هناك طلبين تحت نفس العملية ، على الرغم من أن منطق المعالجة في coroutines مختلفة تتم معالجة ، إذا تم تعديل كل من المتغير العالمي A ، فسيتم تعديل المتغير العالمي مرتين.
للحصول على التفاصيل ، يرجى الرجوع إلى تعليمات البرمجة في وثيقة Swoole #
استخدم Watish Components يتضمن السياق لتجنب المشكلات المذكورة أعلاه بفعالية
السياق عبارة عن فئة ثابتة لا توفر فقط طرق Get and Set بسيطة ، ولكنها توفر أيضًا GlobalSet و GlobalGet وغيرها من الأساليب لعملية العمل المتعددة المتغيرات العالمية من خلال التواصل العملية.
ملاحظة: يتم تنفيذ إعداد متغير عالمي للعمليات المتعددة (Context :: Global_set ، إلخ) بشكل غير متزامن بناءً على UnixSocket. لا يمكن أن يضمن اتساق البيانات في لحظة معينة. هنا ، يمكنك استخدام Watish Components Utils Table ، وهو جدول ذاكرة KV مغلف لـ Swoole Table ، والذي يمكن أن يستفيد بالكامل من كل صف من الموارد ودعم التسلسل.
عندما يرسل المتصفح طلبًا إلى الخادم ، سيقوم الخادم باستدعاء طريقة المقبض ، ثم يحكم على ما إذا كان المسار المطلوب موجودًا من خلال جدولة التوجيه. توجد معلمات التوجيه ، وتغلفها إلى Watish Components struct reppor
طريقتان لتسجيل التوجيه
ملاحظة: تحتاج إلى تعديل ** register_route_auto ** إلى صواب في **/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 ' )
];
}
}تم توجيه الرمز أعلاه على النحو التالي
| طريق | وحدة تحكم | طريقة | الوسيطة |
|---|---|---|---|
| /مرحبا/الفهرس | Hellocontroller@index | أي | لا أحد |
| /hello/user/{name} | 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
على سبيل المثال:
<?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 ' )
];
}
}كما ذكر أعلاه ، فإن طريقة الفهرس وطريقة 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 يجب أن تكون من نوع الفراغ) لجعلها طريقة غير متزامنة
يتم تخزين ملفات فئة الأوامر في المشروع/src/command/
ملاحظة: تتطلب فئة الأوامر واجهة تطبيق CommandInter
يمكن لفئات الأوامر تسجيل الأوامر فقط باستخدام التعليقات التوضيحية
رمز العينة كما يلي:
<?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/
ملاحظة: تحتاج جميع فئات المهام إلى تنفيذ واجهة TaskInter
تدعم فئة المهام فقط تسجيل المهام المحددة باستخدام شرح 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 () ** إرجاع تغليف من مُنشئ الاستعلام عن لارافيل (تغيير بشكل أساسي منطق PDO الأساسي ، لا يوجد فرق في الاستخدام العادي)
Watish Components يتضمن database :: redis () إرجاع عميل predis
يرجى تكوين قاعدة البيانات أولاً! ملف التكوين: Project/Config/Database.php
يستخدم الإطار المكونات التالية ويغلف بعض المكونات
تحت مساحة اسم Watish Components Constructor ، يتم توفير بناء سريع لبعض المكونات
AsynctaskConstructor :: Make () تسليم المهام غير المتزامن
LocalFileSystemConstructor :: getFilesystem () مُنشئ نظام الملفات المحلي
ValitatorConstructor :: Make (Array $ Data ، Array $ Rules) Constructor
بفضل مطوري المكونات الممتازة
بيئة الاختبار: 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
يرجى تشغيل التثبيت الملحن أولاً