Yaşam Döngüsü

Süreç Yaşam Döngüsü

  • Her süreç uzun bir yaşam döngüsüne sahiptir.
  • Her süreç bağımsız olarak çalışır ve birbirini etkilemez.
  • Her süreç yaşam döngüsü boyunca birden fazla isteği işleyebilir.
  • Süreç, stop, reload, restart komutlarını aldığında çıkış yapar ve mevcut yaşam döngüsünü sona erdirir.

İpucu
Her süreç bağımsızdır ve bu, her sürecin kendi kaynaklarını, değişkenlerini ve sınıf örneklerini tuttuğu anlamına gelir; bu, her sürecin kendi veritabanı bağlantısına sahip olduğu şeklinde kendini gösterir. Bazı singleton'lar her süreçte bir kez başlatılır, bu nedenle birden fazla süreç, bunları birden fazla kez başlatacaktır.

İstek Yaşam Döngüsü

  • Her istek bir $request nesnesi oluşturur.
  • $request nesnesi istek işlendikten sonra geri kazanılır.

Kontrolcü Yaşam Döngüsü

  • Her kontrolcü, her süreçte yalnızca bir kez örneklenir; birden fazla süreçte birden fazla kez örneklenir (kontrolcü yeniden kullanımının kapatılması durumu hariç, kontrolcü yaşam döngüsü bölümüne bakınız).
  • Kontrolcü örnekleri, geçerli süreçte birden fazla istek tarafından paylaşılır (kontrolcü yeniden kullanımının kapatılması durumu hariç).
  • Kontrolcü yaşam döngüsü, süreç çıkış yaptığında sona erer (kontrolcü yeniden kullanımının kapatılması durumu hariç).

Değişken Yaşam Döngüsü Hakkında

webman, PHP tabanlı bir framework olduğundan, PHP'nin değişken geri kazanım mekanizmasını tamamen takip eder. İş mantığıyla oluşturulan geçici değişkenler, new anahtar kelimesiyle oluşturulan sınıf örneklerini içerir; bu değişkenler, fonksiyon veya yöntem sona erdiğinde otomatik olarak geri kazanılır; manuel olarak unset ile serbest bırakılması gerekmez. Yani webman geliştirme deneyimi, geleneksel framework geliştirme deneyimi ile neredeyse aynıdır. Aşağıdaki örnekte, index yönteminin sona ermesiyle $foo örneği otomatik olarak serbest bırakılacaktır:

<?php

namespace app\controller;

use app\service\Foo;
use support\Request;

class IndexController
{
    public function index(Request $request)
    {
        $foo = new Foo(); // Burada bir Foo sınıfı olduğunu varsayıyoruz.
        return response($foo->sayHello());
    }
}

Eğer bir sınıf örneğinin yeniden kullanılmasını istiyorsanız, sınıfı sınıfın statik özelliğinde veya uzun yaşam döngüsüne sahip bir nesnenin (örneğin kontrolcü) özelliğinde saklayabilirsiniz; ayrıca Container konteynerinin get yöntemini kullanarak sınıf örneğini de başlatabilirsiniz. Örneğin:

<?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() yöntemi, sınıf örneğini oluşturmak ve saklamak için kullanılır; bir sonraki çağrıda aynı parametrelerle çağrıldığında daha önce oluşturulan sınıf örneğini döndürecektir.

Dikkat
Container::get() yöntemi yalnızca yapıcı parametreleri olmayan örnekleri başlatabilir. Container::make() yapıcı fonksiyon parametrelerine sahip örnekleri oluşturabilir; ancak Container::get() yönteminden farklı olarak, Container::make() örneği yeniden kullanmaz; yani aynı parametrelerle bile Container::make() her zaman yeni bir örnek döndürür.

Bellek Sızıntısı Hakkında

Çoğu durumda, iş kodlarımızda bellek sızıntısı meydana gelmez (çok az kullanıcı bellek sızıntısı bildirmiştir); yalnızca uzun yaşam döngüsüne sahip dizi verilerinin sonsuz büyümesini önlemeye dikkat etmemiz yeterlidir. Aşağıdaki koda göz atın:

<?php
namespace app\controller;

use support\Request;

class FooController
{
    // Dizi özelliği
    public $data = [];

    public function index(Request $request)
    {
        $this->data[] = time();
        return response('hello index');
    }

    public function hello(Request $request)
    {
        return response('hello webman');
    }
}

Kontrolcüler varsayılan olarak uzun süre yaşar (kontrolcü yeniden kullanımının kapatılması durumu hariç), bu nedenle kontrolcünün $data dizi özelliği de uzun süreli olup, foo/index istekleri sürekli arttıkça $data dizisindeki eleman sayısı artar ve bellek sızıntısına yol açar.

Daha fazla bilgi için bellek sızıntısı bölümüne bakınız.