1.5 Yükseltme Kılavuzu

Yükseltmeden önce yedekleme yapmayı unutmayın, aşağıdaki komutları çalıştırarak yükseltme işlemini gerçekleştirin
composer require workerman/webman-framework ^1.5 -W && composer require webman/console ^1.2.12 && php webman install

Özellikler ve Değişiklikler

workerman v5coroutine (işbirliği) desteği

Not
workerman v5 PHP>=8.1 gerektirir
workerman'ın yükseltme komutu: composer require workerman/workerman ^5.0.0 -W
Fiber coroutine için yükleme gereklidir: composer require revolt/event-loop ^1.0.0

Örnek

Gecikmeli Yanıt

<?php

namespace app\controller;

use support\Request;
use Workerman\Timer;

class TestController
{
    public function index(Request $request)
    {
        // 1.5 saniye bekleyin
        Timer::sleep(1.5);
        return $request->getRemoteIp();
    }
}

Timer::sleep() PHP'nin varsayılan sleep() fonksiyonu ile benzerdir, farklılık ise Timer::sleep()'in işlemi bloke etmemesidir.

HTTP İsteği Gönderme

Not
Kurulum için şu komutu çalıştırın: composer require workerman/http-client ^2.0.0

<?php

namespace app\controller;

use support\Request;
use Workerman\Http\Client;

class TestController
{
    public function index(Request $request)
    {
        static $client;
        $client = $client ?: new Client();
        $response = $client->get('http://example.com'); // Asenkron isteği senkron bir şekilde başlatma
        return $response->getBody()->getContents();
    }
}

Aynı şekilde $client->get() isteği bloke etmeyen bir yapıdadır, bu da webman tarafından HTTP isteği bloke etmeden işlemek için kullanılabilir ve performansı artırabilir.

Daha fazlası için workerman/http-client sayfasına bakabilirsiniz.

support\Context Sınıfı Eklendi

support\Context sınıfı, isteğe bağlı verileri depolamak için kullanılır ve istek tamamlandığında ilgili bağlam verileri otomatik olarak silinir. Yani bağlam verilerinin ömrü istek ömrü ile aynıdır.

Global Değişken Kirliliği

Corotinic çevrede, isteğe bağlı durum bilgilerini global değişkenlerde veya statik değişkenlerde saklamak yasaktır, çünkü bu durum, global değişken kirliliğine neden olabilir, örneğin

<?php

namespace app\controller;

use support\Request;
use Workerman\Timer;

class TestController
{
    protected static $name = '';

    public function index(Request $request)
    {
        static::$name = $request->get('name');
        Timer::sleep(5);
        return static::$name;
    }
}

İşlem sayısını 1 olarak ayarladığımızda, ardışık olarak iki tane istek gönderdiğimizde:
http://127.0.0.1:8787/test?name=lilei
http://127.0.0.1:8787/test?name=hanmeimei
İki isteğin de sırasıyla lilei ve hanmeimei şeklinde yanıt vermesini bekleriz, ancak gerçekte verilen yanıtların ikisi de hanmeimei şeklinde gelir.
Bunun nedeni ikinci isteğin statik değişken $name'i geçersiz kılmasıdır, ilk isteğin uyku modunu bitirip dönüş yaptığında, statik değişken $name'in değeri hanmeimei olmuştur.

Doğru yöntem, istek durum bilgilerini bağlama depolamaktır

<?php

namespace app\controller;

use support\Request;
use support\Context;
use Workerman\Timer;

class TestController
{
    public function index(Request $request)
    {
        Context::set('name', $request->get('name'));
        Timer::sleep(5);
        return Context::get('name');
    }
}

Yerel değişkenler kirliliğe neden olmaz

<?php

namespace app\controller;

use support\Request;
use support\Context;
use Workerman\Timer;

class TestController
{
    public function index(Request $request)
    {
        $name = $request->get('name');
        Timer::sleep(5);
        return $name;
    }
}

$name yerel bir değişken olduğu için, corotinler arasında yerel değişkenlere erişilemez, bu yüzden yerel değişken kullanımı corotin güvenlidir.

Corotine (İşbirliği) Hakkında

Corotine (İşbirliği) bir gümüş kurşun değildir, corotine'in kullanımı global değişken/kirlenme sorununa dikkat etmeyi ve bağlam bağlamını ayarlamayı gerektirir. Ayrıca corotin ortamında hata ayıklama, bloklu programlamadan daha karmaşıktır.

webman bloklu programlama aslında yeterince hızlıdır, techempower.com sitesindeki son üç yıldaki karşılaştırmalı test verilerine göre, webman'ın bloklu programlaması, veritabanı işlemleri dahil olmak üzere, Go'nun web çerçevesi gin, echo gibi çerçevelerden neredeyse iki kat daha hızlı, geleneksel laravel çerçevesinden ise neredeyse 40 kat daha hızlıdır.

Veritabanı, redis gibi şeyler yerel ağda olduğunda, çok işlemli bloklu programlama performansı genellikle corotine'den daha iyidir, bu durum, veritabanı, redis vb. yeterince hızlı olduğunda, corotine oluşturma, planlama ve yok etme maliyetinin, işlem değişiminden daha yüksek olabileceği anlamına gelir, bu nedenle corotine'nin performansı önemli ölçüde artırmadığı durumda corotine'nin getirilmesi önemli bir etki yapmaz.

Ne Zaman Corotine Kullanılır

İşte ziyaret süresi uzun olan bir durumlarda, örneğin, işlemin üçüncü taraf API'larına erişmesi gerektiğinde, asenkron bir HTTP isteği başlatmak için workerman/http-client kullanılabilir, bu da uygulamanın eş zamanlı kapasitesini artırabilir.