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; ancakContainer::get()
yönteminden farklı olarak,Container::make()
örneği yeniden kullanmaz; yani aynı parametrelerle bileContainer::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.