Yapıcı Fonksiyon __construct

Açıklama:

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

Worker konteyner örneğini başlatır ve belirli bir işlevi tamamlamak için konteynerin bazı özelliklerini ve geri çağrı arabirimlerini ayarlayabilir.

Parametreler

$dinle (isteğe bağlı, belirtilmezse herhangi bir bağlantı noktası dinlenmediği anlamına gelir.)

Eğer $dinle parametresi belirtilmişse, soket dinlemesi yapılır.

$listen formatı ://

aşağıdaki formatlardan biri 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 gereklidir)

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 tarafından yerleşik bir metin protokolüdür, telnet ile uyumludur, ayrıntılar için Ek Text protokolüne bakınız)

Ve diğer özel protokoller, bu kılavuzun özel iletişim protokolü bölümüne bakınız.

aşağıdaki formatlardan biri olabilir:

Eğer unix soket ise, adres yerel disk yoludur.

Unix soketi değilse, adres formatı :

```0.0.0.0``` yerel tüm ağ kartlarını içeren, dahili IP'leri, harici IP'leri ve yerel döngüyü içerir. ```127.0.0.1``` yerel döngüyü dinleyip sadece yerel makineden erişilebilir, dış dünyadan erişilemez. ```192.168.xx.xx``` gibi dahili IP adresleri, yalnızca dahili IP'leri dinler, harici kullanıcılar erişemez. Belirtilen , mevcut bir host IP'si değilse dinleyemez ve ```Cannot assign requested address``` hatası verir. **Not:** 65535'ten büyük olamaz. 1024'ten küçükse soketi dinleyebilmek için kök yetki gereklidir. Dinlenen port mevcut olmayan bir makineye ait olmalıdır, aksi takdirde dinlenemez ve ```Address already in use``` hatası verir. #### **``` $context ```** Bir dizi. Soketin bağlam seçeneklerini iletmek için kullanılır, [Socket Context Options](https://php.net/manual/tr/context.socket.php) bakınız. ## Örnekler Worker HTTP isteklerini işlemek üzere HTTP konteyneri olarak 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("merhaba"); }; // Worker'ı çalıştır Worker::runAll(); ``` Worker websocket isteklerini işlemek üzere websocket konteyneri olarak 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("merhaba"); }; // Worker'ı çalıştır Worker::runAll(); ``` Worker TCP isteklerini işlemek üzere TCP konteyneri olarak 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("merhaba"); }; // Worker'ı çalıştır Worker::runAll(); ``` Worker UDP isteklerini işlemek üzere UDP konteyneri olarak 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("merhaba"); }; // 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("merhaba"); }; // Worker'ı çalıştır Worker::runAll(); ``` Herhangi bir dinleme yapmayan Worker konteyneri, bazı zamanlanmış görevleri işlemek 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 "görev çalıştır\n"; }); }; // Worker'ı çalıştır Worker::runAll(); ``` **Worker özel bir protokolü dinler** Son dizin yapısı ``` ├── Protocols // Oluşturulmak istenen Protocols klasörü │   └── MyTextProtocol.php // Oluşturulmak istenen özel protokol dosyası ├── test.php // Oluşturulmak istenen test betiği └── Workerman // Workerman kaynak kod dizini, buradaki kodlar değişmiyor ``` 1. Protocols dizini oluşturun ve bir protokol dosyası oluşturun Protocols/MyTextProtocol.php (yukarıdaki dizin yapısına bakınız) ```php // Kullanıcı özel protokol ad alanı Protocols olarak ayarlanmalıdır namespace Protocols; // Basit metin protokolü, protokol formatı metin + satır başıdır class MyTextProtocol { // Paketleme işlevi, mevcut paketin uzunluğunu döndürür public static function input($recv_buffer) { // Satır sonu bulunur $pos = strpos($recv_buffer, "\n"); // Satır sonu bulunamazsa, tam bir paket değil, 0 döndürerek veri bekler if($pos === false) { return 0; } // Satır sonu bulunursa, mevcut paketin uzunluğunu, satır sonu dahil döndürür return $pos+1; } // Tam paket alındıktan sonra otomatik olarak MyTextProtocol::decode('alınan_data') çalışır // Sonuç $data yoluyla onMessage geri çağrısına aktarılır public static function decode($recv_buffer) { return trim($recv_buffer); } // Sunucu tarafından gönderilmeden önce data encode edilir, burada satır sonu eklenir public static function encode($data) { return $data."\n"; } } ``` 2. MyTextProtocol protokolünü kullanarak istekleri dinleme 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 veri alındıktan sonra (satır sonuyla biten) otomatik MyTextProtocol:: decode('alınan veri') çalışır * Sonuç $data yoluyla onMessage'e iletilir */ $text_worker->onMessage = function(TcpConnection $connection, $data) { var_dump($data); /* * Client'a veri gönderilirken, otomatik olarak MyTextProtocol:: encode('hello world') kodlanır * ve sonra istemciye gönderilir */ $connection->send("hello world"); }; // Tüm çalışanları çalıştır Worker::runAll(); ``` 3. Test Terminali açın, test.php dosyasının 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ı işçi dinleme süreçler durum root yok myTextProtocol://0.0.0.0:5678 1 [OK] ---------------------------------------------------------------- Çıkmak için Ctrl-C'ye basın. Başlatma başarılı. ``` Terminali açın ve telnet kullanarak test edin (linux sistemlerinin telnet kullanması önerilir) Varsayılan olarak yerel IP için test edildiği düşünülürse, terminalde telnet 127.0.0.1 5678 komutunu çalıştırın ve ardından hi yazarak enter tuşuna basın ```php telnet 127.0.0.1 5678 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. hi hello world ```