دورة الحياة
دورة حياة العمليات
- كل عملية لها دورة حياة طويلة
- كل عملية تعمل بشكل مستقل ولا تتداخل مع بعضها
- يمكن لكل عملية معالجة عدة طلبات خلال دورة حياتها
- ستقوم العملية بإنهاء دورة حياتها عند تلقي أوامر
stop
أوreload
أوrestart
تذكير
كل عملية مستقلة ولا تتداخل مع غيرها، مما يعني أن كل عملية تحتفظ بمواردها، متغيراتها، ونسخ الكلاسات الخاصة بها، حيث يوجد في كل عملية اتصال قاعدة بيانات خاص بها، وبعض النسخ الفردية يتم تهيئتها مرة واحدة في كل عملية، لذا فإن وجود عمليات متعددة سيؤدي إلى تهيئة متعددة.
دورة حياة الطلبات
- كل طلب سيولد كائن
$request
- سيتم استرداد كائن
$request
بعد الانتهاء من معالجة الطلب
دورة حياة المتحكم
- كل متحكم يتم تهيئته مرة واحدة فقط لكل عملية، لكن يمكن أن يتم تهيئته عدة مرات عبر عمليات متعددة (باستثناء إعادة استخدام المتحكم، راجع دورة حياة المتحكم)
- سيتم مشاركة نسخة المتحكم داخل عملية واحدة عبر طلبات متعددة (باستثناء إعادة استخدام المتحكم)
- تنتهي دورة حياة المتحكم بعد خروج العملية (باستثناء إعادة استخدام المتحكم)
حول دورة حياة المتغيرات
webman تم تطويره بناءً على PHP، لذا فهو يتبع تمامًا آلية استرداد المتغيرات في PHP. تتضمن المتغيرات المؤقتة التي يتم إنشاؤها في منطق الأعمال النسخ التي تم إنشاؤها باستخدام الكلمة الأساسية new، والتي سيتم استردادها تلقائيًا بعد انتهاء الدالة أو الطريقة، دون الحاجة إلى استخدام unset
. هذا يعني أن تجربة تطوير webman تتشابه أساسيًا مع تجربة تطوير الأطر التقليدية. على سبيل المثال، في المثال أدناه، سيتم تحرير نسخة $foo
تلقائيًا عند الانتهاء من تنفيذ طريقة index:
<?php
namespace app\controller;
use app\service\Foo;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = new Foo(); // هنا نفترض وجود فئة Foo
return response($foo->sayHello());
}
}
إذا كنت ترغب في إعادة استخدام نسخة من فئة ما، يمكنك حفظ الفئة في خاصية ثابتة للفئة أو خاصية كائن ذو دورة حياة طويلة (مثل المتحكم)، يمكنك أيضًا استخدام طريقة get من الحاوية Container لتهيئة نسخة الفئة، مثل:
<?php
namespace app\controller;
use app\service\Foo;
use support\Container;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$foo = Container::get(Foo::class);
return response($foo->sayHello());
}
}
تستخدم طريقة Container::get()
لإنشاء وحفظ نسخة من الفئة، وعند استدعائها مرة أخرى بنفس المعلمات، ستعيد النسخة التي تم إنشاؤها سابقًا.
ملاحظة
Container::get()
يمكنه فقط تهيئة نسخ بدون معلمات مُنشئة. يمكن لـContainer::make()
إنشاء نسخ تأخذ معلمات وظيفية، لكن على عكسContainer::get()
، فإنContainer::make()
لن تعيد استخدام النسخة، مما يعني أنه حتى مع نفس المعلمات، ستعيدContainer::make()
دائمًا نسخة جديدة.
حول تسرب الذاكرة
في معظم الحالات، لا تحدث تسربات الذاكرة في كود الأعمال لدينا (نادراً ما يتم الإبلاغ من قبل المستخدمين عن حدوث تسرب في الذاكرة)، يكفي فقط أن نكون حذرين بشأن عدم اتساع بيانات المصفوفة ذات الدورة الطويلة بشكل غير محدود. انظر إلى الكود التالي:
<?php
namespace app\controller;
use support\Request;
class FooController
{
// خاصية المصفوفة
public $data = [];
public function index(Request $request)
{
$this->data[] = time();
return response('hello index');
}
public function hello(Request $request)
{
return response('hello webman');
}
}
المتحكم بشكل افتراضي لديه دورة حياة طويلة (باستثناء إعادة استخدام المتحكم)، وكذلك خاصية المصفوفة $data
للمتحكم لديها أيضًا دورة حياة طويلة، مع تزايد طلبات foo/index
، سيؤدي إلى زيادة عناصر مصفوفة $data
مما قد يؤدي إلى تسرب في الذاكرة.
لمزيد من المعلومات المتعلقة، يرجى الرجوع إلى تسرب الذاكرة