Yapıcı Fonksiyonu __construct

Açıklama:

Worker::__construct([string $listen , array $context])

Bir Worker konteyner örneği başlatır, konteynerin bazı özelliklerini ve geri çağırma arayüzlerini ayarlayarak belirli işlevleri yerine getirir.

Parametreler

$listen (isteğe bağlı parametre, boş bırakılması durumunda hiçbir port dinlenmeyecek)

Eğer $listen parametresi ayarlanmışsa, socket dinleme işlemi gerçekleştirilecektir.

$listen biçimi :// şeklindedir.

aşağıdaki biçimlere sahip olabilir:

tcp: örneğin tcp://0.0.0.0:8686

udp: örneğin udp://0.0.0.0:8686

unix: örneğin unix:///tmp/my_file (Workerman>=3.2.7 gerektirir)

http: örneğin http://0.0.0.0:80

websocket: örneğin websocket://0.0.0.0:8686

text: örneğin text://0.0.0.0:8686 (text, Workerman'ın yerleşik metin protokolüdür; telnet ile uyumludur, ayrıntılar için ek bölümdeki Text protokolüne bakınız)

ve diğer özel protokoller, bu el kitabındaki iletişim protokollerini özelleştirme bölümüne bakınız.

aşağıdaki biçimlere sahip olabilir:

Eğer unix soketi ise, adres yerel bir disk yolu olmalıdır.

Unix olmayan soketler için, adres biçimi :<port numarası> şeklindedir.

değeri ```0.0.0.0``` olabilir ve bu, tüm yerel ağ arabirimlerini dinlemek anlamına gelir; iç ağ ip'leri, dış ağ ip'leri ve yerel döngü adresi olan 127.0.0.1'i içerir. değeri ```127.0.0.1``` olarak ayarlanırsa, bu yalnızca yerel döngüyü dinler; dışarıdan erişim olmayacaktır. eğer iç ağ ip'si ise, örneğin ```192.168.xx.xx``` gibi, bu durumda yalnızca iç ağ ip'sini dinler; bu durumda dış kullanıcıların erişimi olmayacaktır. olarak ayarlanan değer yerel ip'nizi içeriyorsa, dinleme işlemi gerçekleştirilecektir. Aksi halde, ```Cannot assign requested address``` hatası verilecektir. **Dikkat:** 65535'den büyük olamaz. 1024'ten küçükse, dinleme işlemi için root yetkisi gereklidir. Dinlenen port, yerel makinede kullanılmıyor olmalıdır; aksi takdirde, dinleme gerçekleştirilemeyecek ve ```Address already in use``` hatası verilecektir. #### **``` $context ```** Bir dizi. Soketin bağlam seçeneklerini iletmek için kullanılır, [socket bağlam seçenekleri](https://php.net/manual/tr/context.socket.php) kısmına bakınız. ## Örnek Worker, http konteyneri olarak http isteklerini dinler ```php use Workerman\Worker; use Workerman\Connection\TcpConnection; use Workerman\Protocols\Http\Request; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker('http://0.0.0.0:8686'); $worker->onMessage = function(TcpConnection $connection, Request $request) { $connection->send("hello"); }; // worker'ı çalıştır Worker::runAll(); ``` Worker, websocket konteyneri olarak websocket isteklerini dinler ```php use Workerman\Worker; use Workerman\Connection\TcpConnection; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker('websocket://0.0.0.0:8686'); $worker->onMessage = function(TcpConnection $connection, $data) { $connection->send("hello"); }; // worker'ı çalıştır Worker::runAll(); ``` Worker, tcp konteyneri olarak tcp isteklerini dinler ```php use Workerman\Worker; use Workerman\Connection\TcpConnection; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker('tcp://0.0.0.0:8686'); $worker->onMessage = function(TcpConnection $connection, $data) { $connection->send("hello"); }; // worker'ı çalıştır Worker::runAll(); ``` Worker, udp konteyneri olarak udp isteklerini dinler ```php use Workerman\Worker; use Workerman\Connection\TcpConnection; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker('udp://0.0.0.0:8686'); $worker->onMessage = function(TcpConnection $connection, $data) { $connection->send("hello"); }; // worker'ı çalıştır Worker::runAll(); ``` Worker, unix domain soketini dinler ```(Workerman sürümü >=3.2.7 gerektirir)``` ```php use Workerman\Worker; use Workerman\Connection\TcpConnection; require_once __DIR__ . '/vendor/autoload.php'; $worker = new Worker('unix:///tmp/my.sock'); $worker->onMessage = function(TcpConnection $connection, $data) { $connection->send("hello"); }; // worker'ı çalıştır Worker::runAll(); ``` Herhangi bir dinleme gerçekleştirmeyen Worker konteyneri, bazı zamanlayıcı görevlerini yerine getirmek için kullanılır ```php use \Workerman\Worker; use \Workerman\Timer; require_once __DIR__ . '/vendor/autoload.php'; $task = new Worker(); $task->onWorkerStart = function($task) { // Her 2.5 saniyede bir çalıştır $time_interval = 2.5; Timer::add($time_interval, function() { echo "task run\n"; }); }; // worker'ı çalıştır Worker::runAll(); ``` **Worker, özel protokolün portunu dinler** Son dizin yapısı ``` ├── Protocols // Oluşturulacak Protocols dizini │   └── MyTextProtocol.php // Oluşturulacak özel protokol dosyası ├── test.php // Oluşturulacak test betiği └── Workerman // Workerman kaynak dizini, içindeki kodda değişiklik yapmayın ``` 1. Protoclos dizinini oluşturun ve bir protokol dosyası oluşturun. Protocols/MyTextProtocol.php (yukarıdaki dizin yapısına bakarak) ```php // Kullanıcı tanımlı protokol ad alanı Protocols olarak standartlaştırılacaktır namespace Protocols; // Basit metin protokolü, protokol biçimi metin+satır sonu class MyTextProtocol { // Paketleme işlevi, mevcut paketin uzunluğunu döndürür public static function input($recv_buffer) { // Satır sonu karakterini bul $pos = strpos($recv_buffer, "\n"); // Satır sonu karakteri bulunamadıysa, bu tam bir paket değil demektir; 0 döndürerek veri beklemeye devam et if($pos === false) { return 0; } // Satır sonu karakteri bulunduysa, mevcut paketin uzunluğunu döndür, satır sonu karakterini de dahil et return $pos+1; } // Tam bir paket alındığında otomatik olarak decode edilir, burada sadece satır sonu karakterini kesiyoruz public static function decode($recv_buffer) { return trim($recv_buffer); } // Müşteriye veri gönderirken otomatik olarak encode edilir, ardından istemciye gönderilir; burada satır sonu karakteri eklenmiştir public static function encode($data) { return $data."\n"; } } ``` 2. MyTextProtocol protokolünü kullanarak istekleri dinleyin Yukarıdaki son dizin yapısına bakarak test.php dosyasını oluşturun. ```php use Workerman\Worker; use Workerman\Connection\TcpConnection; require_once __DIR__ . '/vendor/autoload.php'; // #### MyTextProtocol worker #### $text_worker = new Worker("MyTextProtocol://0.0.0.0:5678"); /* * Tam bir veri alındığında (sonuç satır sonu ile sonlanıyorsa) otomatik olarak MyTextProtocol::decode('alınan veri') çağrılır * Sonuç $data değişkeni ile onMessage geri çağırma işlevine iletilir */ $text_worker->onMessage = function(TcpConnection $connection, $data) { var_dump($data); /* * İstemciye veri göndermeden önce otomatik olarak MyTextProtocol::encode('hello world') protokol kodlaması yapılacaktır, * ardından istemciye gönderilecektir */ $connection->send("hello world"); }; // tüm worker'ları çalıştır Worker::runAll(); ``` 3. Test Terminali açın, test.php'nin bulunduğu dizine gidin ve ```php test.php start``` komutunu çalıştırın. ``` php test.php start Workerman[test.php] DEBUG modunda başlatıldı ----------------------- WORKERMAN ----------------------------- Workerman sürümü:3.2.7 PHP sürümü:5.4.37 ------------------------ WORKERS ------------------------------- kullanıcı worker dinleme süreçler durum root yok myTextProtocol://0.0.0.0:5678 1 [OK] ---------------------------------------------------------------- Çıkmak için Ctrl-C tuşlayın. Başlatma başarılı. ``` Terminali açın, telnet ile test edin (linux sistemlerinde telnet kullanmanız önerilir). Varsayalım ki bu yerel bir test, Terminalde telnet 127.0.0.1 5678 komutunu girin. ve ardından hi yazarak Enter tuşuna basın. hello world\n şeklinde veri alacaksınız. ``` telnet 127.0.0.1 5678 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. hi hello world ```