دورة الحياة

دورة حياة العملية

  • لكل عملية دورة حياة طويلة
  • تعمل كل عملية بشكل مستقل دون التأثير على الأخرى
  • يمكن لكل عملية معالجة طلبات متعددة خلال دورة حياتها
  • تنهي العملية دورتها الحالية وتغادر عند استلام أوامر stop أو reload أو restart

نصيحة
كل عملية مستقلة ولا تؤثر على الأخرى، مما يعني أن كل عملية تحافظ على مواردها ومتغيراتها ونسخ فئاتها. وهذا يتجلى في أن لكل عملية اتصال قاعدة بيانات خاص بها، ويتم تهيئة بعض الـ singletons مرة واحدة لكل عملية، وبالتالي فإن العمليات المتعددة ستؤدي إلى تهيئات متعددة.

دورة حياة الطلب

  • يولّد كل طلب كائن $request
  • يتم إعادة تدوير كائن $request بعد انتهاء معالجة الطلب

دورة حياة المتحكّم

  • يُنشأ كل متحكّم مرة واحدة فقط لكل عملية، وعند وجود عمليات متعددة يُنشأ مرات متعددة (ما لم يتم إيقاف إعادة استخدام المتحكّم، انظر دورة حياة المتحكّم)
  • تتم مشاركة نسخة المتحكّم بين طلبات متعددة ضمن العملية الحالية (ما لم يتم إيقاف إعادة استخدام المتحكّم)
  • تنتهي دورة حياة المتحكّم بعد خروج العملية (ما لم يتم إيقاف إعادة استخدام المتحكّم)

حول دورة حياة المتغيرات

webman مبنية على PHP، لذا تلتزم بالكامل بآلية إعادة تدوير المتغيرات في PHP. تُعاد تدوير المتغيرات المؤقتة الناتجة في منطق الأعمال، بما في ذلك نسخ الفئات المنشأة بكلمة new، تلقائياً عند انتهاء الدالة أو Method، دون الحاجة إلى unset يدوياً. أي أن تجربة التطوير بـ webman مطابقة تقريباً للتطوير بإطارات العمل التقليدية. مثلاً، في المثال التالي سيتم تحرير نسخة $foo تلقائياً عند انتهاء تنفيذ method الـ 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());
    }
}

إذا أردت إعادة استخدام نسخة فئة معيّنة، يمكنك حفظ الفئة في خاصية ثابتة للفئة أو في خاصية كائن طويل العمر (مثل المتحكّم)، أو استخدام method الـ 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() استخدام النسخة، أي أنها دائماً تُرجع نسخة جديدة حتى بنفس المعاملات.

حول تسرّب الذاكرة

في الغالبية العظمى من الحالات، كود الأعمال لا يسبب تسرّب ذاكرة (قليل جداً ما يبلّغ المستخدمون عن تسرّب ذاكرة)، يكفي الانتباه إلى عدم توسّع بيانات مصفوفات دورة الحياة الطويلة بلا حدود. انظر الكود التالي:

<?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 مما يؤدي إلى تسرّب الذاكرة.

للمزيد من المعلومات راجع تسرّب الذاكرة