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
```