ServBay'de Workerman Uygulaması Kurmak ve Çalıştırmak
Genel Bakış
Bu doküman, ServBay kullanıcılarına yerel macOS ve Windows geliştirme ortamlarında entegre PHP ve Composer desteğiyle, Workerman tabanlı yüksek performanslı asenkron ağ uygulamalarını hızlıca kurup çalıştırmayı adım adım göstermeyi amaçlar. Workerman, yüksek eşzamanlı işlem gerektiren Web sunucuları, gerçek zamanlı iletişim sunucuları, oyun sunucuları gibi çeşitli ağ servislerinin geliştirilmesi için güçlü bir PHP kütüphanesidir. ServBay ise kutudan çıktığı gibi çalışan geliştirme platformu ile Workerman ortam kurulumunu büyük oranda kolaylaştırır.
Workerman Nedir?
Workerman, tamamen PHP ile yazılmış, açık kaynaklı, yüksek performanslı, asenkron ağ iletişim çatısıdır. Olay döngüsü (EventLoop) mekanizmasına dayanır; asenkron, engellemeyen I/O gerçekleştirmek için tasarlanmıştır ve aynı anda çok sayıda bağlantıyı verimli şekilde işleyebilir. Geleneksel PHP Web geliştirme (örneğin Apache/Nginx + PHP-FPM) yaklaşımından farklı olarak Workerman uygulamaları bellek rezident (daimi çalışan) biçimde, belirli portu dinleyerek doğrudan bağlantı ve veri işlemlerini üstlenir. Bu sayede, klasik modeldeki her isteğe özel süreç oluşumu/sonlandırmanın yarattığı yükten kaçınır ve performansı ile işlem kapasitesini ciddi biçimde arttırır.
Workerman ile geliştiriciler kolayca:
- Basit ya da dinamik istekleri işleyebilen yüksek performanslı HTTP sunucuları (hatta Apache/Nginx'in yerini alacak şekilde),
- Sohbet odası, anlık veri iletimi gibi gerçek zamanlı uygulamalar için WebSocket sunucuları,
- Özelleştirilebilir TCP/UDP protokolüne sahip sunucular,
- Komut satırı araçları, zamanlanmış görevler, mikroservisler gibi uygulamalar oluşturabilirler.
Workerman'ın Temel Özellikleri ve Avantajları
- Yüksek Performans: Olay tabanlı ve asenkron engellemeyen I/O çekirdeği sayesinde, çok yüksek eşzamanlı bağlantıyı işleyerek, mükemmel performans sunar.
- Çoklu Protokol Desteği: HTTP, WebSocket, TCP, UDP gibi yaygın ağ protokollerini dahili olarak destekler ve geliştiricinin özel protokoller yazabilmesi için esnek arayüzler sunar.
- Kullanım Kolaylığı: Basit ve anlaşılır API’leri ile asenkron ağ programlamasını daha kolay hale getirir, PHP geliştiricilerinin hızla adapte olabilmesini sağlar.
- Esnek Genişletme: Çok süreçli model ile çok çekirdekli CPU üzerindeki yatay ölçeklenebilirlik ve yükleme dengeleme olanağı sunar. Composer paketleri ve mevcut PHP kütüphaneleriyle kolayca entegre edilebilir.
- PHP Ekosistemi ile Uyum: PHP kütüphanesi olarak, Composer ile bağımlılık yönetimi ve ekosistemden sorunsuz yararlanabilme.
- Daemon Modu: Arka planda (daemon) sorunsuz şekilde çalışabilir; üretim ortamı için idealdir ve hizmetin kesintisiz sunulmasını sağlar.
Workerman, PHP geliştiricilerinin yüksek performanslı, gerçek zamanlı ve yüksek eşzamanlı ağ uygulamaları geliştirmesinin önündeki kapıları açıyor.
ServBay ile Workerman Geliştirme Ortamı Kurulumu
ServBay; Web geliştiriciler için hazırlanan, PHP, Node.js, Python, Go, Java gibi popüler programlama dilleri, Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached gibi sık kullanılan sunucu ve veritabanı yazılımlarını bir arada sunan yerel geliştirme aracıdır. ServBay’in en önemli avantajlarından biri, “kutudan çıktığı gibi” çalışması ve Composer’ın hazır şekilde entegre tüm PHP ortamlarında kullanıma açık olmasıdır. Bu sayede, Workerman projelerini ServBay üzerinde kurup çalıştırmak fazlasıyla kolaylaşır.
Bu rehber; ServBay’de basit bir HTTP sunucusu, WebSocket sunucusu ve TCP sunucusu örnekleri üzerinden, Workerman ortamının hızlıca nasıl kurulup çalıştırılacağını anlatır.
TIP
Kolay yönetim ve standartlaşma için ServBay, tüm yerel site proje dosyalarınızı şu dizin altında barındırmanızı önerir:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Bu dokümandaki tüm dizin örnekleri bu klasörü baz alır.
Ön Gereksinimler
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
- ServBay kurulmuş ve çalışıyor olmalı: ServBay’in resmi web sitesinden en güncel sürümü indirip kurun.
- ServBay'de PHP etkinleştirilmiş olmalı: ServBay panelinde kullanmayı planladığınız PHP versiyonunu etkinleştirin. Workerman için PHP 5.4 ve üstü gereklidir, mümkünse PHP 7.x ya da 8.x ile çalışmanız önerilir.
- Temel PHP ve komut satırı bilgisi: Temel PHP sözdizimi ve terminalde komut satırı kullanımı konusunda fikir sahibi olmalısınız.
Workerman Kurulumu
1. Composer'ın Kullanılabilirliğini Kontrol Edin
ServBay zaten Composer’ı entegre olarak sunar; ayrıca kurmanıza gerek yoktur. ServBay’in çalışır durumda ve istediğiniz PHP sürümünün etkin olduğunu doğrulayın. ServBay bu PHP sürümü için Composer ortamını otomatik hazırlar. ServBay’in terminalini veya sistem PATH’ine eklenen Composer’ı harici bir terminalden rahatça kullanabilirsiniz.
Composer’ın kullanılabilirliğini doğrulamak için terminalde şu komutu girin:
bash
composer -v
1
Doğru şekilde kuruluysa Composer sürüm bilgisini görürsünüz. “Komut bulunamadı” hatası alırsanız, ServBay’in çalışıp çalışmadığını ve PHP sürümünün etkin olduğundan emin olun.
2. Proje Dizinini Oluşturun
ServBay’in önerdiği kök site dizinine gidin, yeni bir proje klasörü oluşturun ve bu klasöre geçin:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
1
2
3
2
3
Burada, Workerman proje dosyalarımızı saklamak üzere servbay-workerman-demo
adlı bir dizin oluşturduk.
3. Composer ile Workerman'ı Kurun
Proje dizininde Composer’ı kullanarak Workerman kütüphanesini kurun. En iyi yöntem budur; Composer tüm bağımlılıkları otomatik yönetecektir:
Proje yolu:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
composer require workerman/workerman
1
Composer, Workerman ve bağımlılıklarını ilgili vendor
klasörüne indirir.
Workerman HTTP Sunucu Kodu Yazmak
Workerman ile HTTP sunucusu en yaygın senaryolardan biridir; yüksek performanslı Web uygulaması veya API servisleri için idealdir.
Proje dizininde http_server.php
(veya dilediğiniz bir isim, örn. server.php
) dosyasını açıp aşağıdaki PHP kodunu ekleyin:
php
<?php
// Workerman sınıflarını kullanmak için Composer’ın autoload dosyasını dahil et
require __DIR__ . '/vendor/autoload.php';
// Workerman'ın Worker sınıfını ve ilgili sınıfları içeri aktar
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
// Worker örneği oluştur, protokol ve adres belirt
// 'http://0.0.0.0:8080' HTTP sunucusunu tüm arayüzlerde 8080 portunda dinler
// 0.0.0.0 sayesinde yerel ya da LAN’daki cihazlardan erişim mümkün olur; 8080 port numarasıdır
$http_worker = new Worker('http://0.0.0.0:8080');
// Worker süreç sayısını ayarla
// 4 süreç başlatılır; CPU çekirdek sayısına göre bu sayı arttırılabilir
$http_worker->count = 4;
// İstemciden mesaj (HTTP isteği) alınca çalışacak mantık
// $connection mevcut bağlantı nesnesi; istemciye cevap göndermek için kullanılır
// $request gelen isteğe ait tüm detayları içerir (URL, başlıklar, gövde vs.)
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// İstemciye basit bir HTTP yanıtı olarak metin gönder
// Workerman, HTTP başlıklarını ve diğer detayları otomatik işler
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// Tüm Worker örneklerini çalıştır
// Workerman’ın ana döngüsünü başlatır, port dinlenir ve olaylar işlenir
Worker::runAll();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Kod Açıklaması:
require __DIR__ . '/vendor/autoload.php';
: Composer'ın otomatik yükleme dosyasını getirerek Workerman sınıflarının kullanılabilir olmasını sağlar.use Workerman\...;
: Gerekli sınıfları dahil eder.new Worker('http://0.0.0.0:8080')
: Worker nesnesi protokol (http) ve adres (0.0.0.0:8080) ile başlatılır.$http_worker->count = 4;
: Süreç (process) sayısı belirlenir; çekirdek sayısına göre arttırılabilir.$http_worker->onMessage = function(TcpConnection $connection, Request $request) { ... };
: Tam bir HTTP isteği alındığında bu fonksiyon işlenir.$connection
istemciye veri gönderme,$request
ise istek bilgilerini içerir.Response
nesnesi ile standart HTTP cevabı oluşturulur.Worker::runAll();
: Tüm Worker’ları ve olay döngüsünü başlatır.
Workerman HTTP Sunucusunu Çalıştırmak
Proje dizininde terminali açıp aşağıdaki komutla HTTP sunucu başlatılır:
Proje yolu:
- macOS:
/Applications/ServBay/www/servbay-workerman-demo
- Windows:
C:\ServBay\www\servbay-workerman-demo
bash
php http_server.php start
1
Çalıştırma Modları:
- Ön Plan (Foreground):
php http_server.php start
ile sunucu başlatıldığında terminal log ve çıktı verir,Ctrl+C
ile kapatılır. Geliştirme ve hata ayıklama için idealdir. - Arka Plan (Daemon): Üretimde sunucunun arka planda çalışması için
-d
parametresini ekleyin:bashSunucu arka plana geçer ve çıktı log dosyasına yönlendirilir (klasörde Workerman üzerinden veya belirtilen dosyada).php http_server.php start -d
1
Süreç Yönetimi:
Workerman aşağıdaki kolay süreç yönetim komutlarını destekler:
- Başlat:
php http_server.php start
(ön plan) veyaphp http_server.php start -d
(arka plan) - Durdur:
php http_server.php stop
(aktif istekler bitirilince zarifçe kapanır) - Yeniden Başlat:
php http_server.php restart
(önce durup sonra yeniden başlatır) - Yumuşak Yeniden Başlatma (Reload):
php http_server.php reload
(genellikle kod güncellemesinde, alt süreçler tek tek yeniden başlar, hizmet kesintisiz devam eder, ancakonWorkerStart
gibi yaşam döngüsüne dikkat edin) - Durum Görüntüle:
php http_server.php status
(süreç, bellek, bağlantı durumu vs.)
Sunucu başladıktan sonra tarayıcıya http://localhost:8080
veya http://127.0.0.1:8080
yazarsanız, Hello ServBay Workerman HTTP Server!
metni görünür.
Workerman ile WebSocket Sunucusu Oluşturmak
WebSocket protokolü; istemci ve sunucu arasında kalıcı, çift yönlü iletişim sağlar. Anlık sohbet, borsa takibi, oyun gibi gerçek zamanlı uygulamalar için idealdir. Workerman WebSocket desteği sunar.
WebSocket Sunucu Kodunu Yaratın
Proje dizininde
websocket_server.php
dosyasını açıp aşağıdaki kodu ekleyin:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // WebSocket sunucu örneği oluştur, 8081 portunu dinle // 'websocket://0.0.0.0:8081' bir WebSocket sunucusu kurar // Workerman WebSocket el sıkışmalarını (handshake) otomatik yönetir $ws_worker = new Worker('websocket://0.0.0.0:8081'); // Bağlantı işlemleri için 4 süreç başlat $ws_worker->count = 4; // Yeni bağlantı kurulduğunda çalışacak mantık // Sunucuya yeni bir istemci bağlanınca tetiklenir $ws_worker->onConnect = function(TcpConnection $connection) { echo "New WebSocket connection from " . $connection->getRemoteIp() . "\n"; }; // Mesaj alındığında işlenecek mantık // Sunucuya istemciden mesaj geldiğinde tetiklenir // $data, istemciden gelen veridir (çözülmüş halde) $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received message: " . $data . "\n"; // Mesajı istemciye döndür (echo) // $connection->send() WebSocket çerçevesi olarak gönderir $connection->send('ServBay Workerman received: ' . $data); }; // Bağlantı kapandığında çalışacak mantık $ws_worker->onClose = function(TcpConnection $connection) { echo "WebSocket Connection closed\n"; }; // Hata oluştuğunda işlemler (isteğe bağlı) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Error: $code - $msg\n"; }; // Tüm Worker örneklerini çalıştır Worker::runAll();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43WebSocket Sunucusunu Başlatın
Proje dizininde terminalden şu komutu verin:
bashphp websocket_server.php start
1Arka planda çalıştırmak için yine
-d
kullanılabilir. Başlatıldıktan sonraws://localhost:8081
adresine bir WebSocket istemcisi ile bağlanabilirsiniz.Örneğin tarayıcı geliştirici araçları Console'unda JavaScript ile test edebilirsiniz:
javascriptvar ws = new WebSocket("ws://localhost:8081"); ws.onopen = function(event) { console.log("WebSocket bağlantısı açıldı"); ws.send("Hello from Browser!"); // Mesaj gönder }; ws.onmessage = function(event) { console.log("Sunucudan gelen mesaj:", event.data); // Mesaj al }; ws.onclose = function(event) { if (event.wasClean) { console.log("WebSocket bağlantısı düzgün kapatıldı, code=" + event.code + " reason=" + event.reason); } else { console.error("WebSocket bağlantısı kapandı"); } }; ws.onerror = function(error) { console.error("WebSocket hatası:", error); }; // Bağlantıyı kapatmak için (isteğe bağlı) // ws.close();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Başarılı bağlantıda terminalde oturum bilgilerini, istemciden mesaj gönderince alınan veri ve sunucu cevabını göreceksiniz.
Workerman ile TCP Sunucusu Oluşturmak
Workerman, özel TCP sunucuları kurmak için de kullanılabilir; bu sayede oyun sunucusu, IoT platformları, özel iletişim servisleri ve benzeri uygulamalara olanak sağlar.
TCP Sunucu Kodunu Yaratın
Proje dizininde
tcp_server.php
dosyasını açıp aşağıdaki kodu ekleyin:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // TCP sunucu örneği oluştur, 8082 portunu dinle // 'tcp://0.0.0.0:8082' ile TCP sunucusu yaratılır // Workerman, metin protokolünü (satır sonu '\n') varsayılan olarak kullanır; başka protokol de belirtilebilir $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // Bağlantıları işlemek için 4 süreç başlat $tcp_worker->count = 4; // Bağlantı kurulunca çalışacak mantık $tcp_worker->onConnect = function(TcpConnection $connection) { echo "New TCP connection from " . $connection->getRemoteIp() . "\n"; // Hoşgeldin mesajı gönder $connection->send("Welcome to ServBay Workerman TCP Server!\n"); }; // Mesaj alınınca işlemler // $data, istemciden gelen TCP verisi (protokole göre işlenmiş) $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Received data: " . $data; // Mesajı istemciye döndür $connection->send('ServBay Workerman received: ' . $data); }; // Bağlantı kapandığında işlemler $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP Connection closed\n"; }; // Tüm Worker örneklerini çalıştır Worker::runAll();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36TCP Sunucusunu Başlatın
Proje dizininde terminalden şu komutla sunucuyu çalıştırın:
bashphp tcp_server.php start
1Arka planda çalıştırmak için yine
-d
kullanılabilir. Sonrasındalocalhost:8082
adresine bir TCP istemcisi bağlayabilirsiniz.Örneğin, terminalde aşağıdaki komutlardan birini kullanın:
bash# telnet ile telnet localhost 8082 # veya nc (netcat) ile nc localhost 8082
1
2
3
4
5Bağlantı başarılıysa sunucunun hoşgeldin mesajını görürsünüz. Herhangi bir metin girip (Enter ile), sunucu size bu mesajı döndürür.
Dikkat Edilecek Noktalar
- Port Çakışmaları: Workerman’ın dinlediği portlar (örnek: 8080, 8081, 8082) başka bir uygulama tarafından kullanılıyorsa sunucu başlatılamaz ve hata verir. Terminalde
lsof -i :port_no
komutu ile kullanım durumunu kontrol edebilirsiniz. - Güvenlik Duvarı: İşletim sisteminin dahili firewall’u dış cihazlardan portlara erişimi engelleyebilir. Yerel geliştirmede genellikle sorun olmaz; ancak LAN üzerinden erişim gerekiyorsa, firewall ayarlarınızı kontrol edin.
- ServBay Web Sunucusu ile İlişkisi: Workerman kendi portunda, Caddy veya Nginx’ten ayrı, bağımsız süreç/birim olarak çalışır. Tipik olarak gelen bağlantıları doğrudan işler; Caddy/Nginx ile proxy kullanmak isterseniz özel yapılandırma gerekebilir. Workerman uzun süreli bağlantı ve yüksek eşzamanlı/asenkron senaryolara (örneğin WebSocket) uygundur, ServBay’in Caddy/Nginx’i ise klasik, kısa süreli HTTP isteklerine odaklanır.
- PHP Sürümü: Workerman için ServBay’de kullanılan PHP sürümü gereklilikleri karşılamalıdır. ServBay’de birden fazla PHP versiyonu yüklü olup, ihtiyacınıza göre panelden etkinleştirebilirsiniz.
- Eklenti Bağımlılıkları: Workerman yüksek performans ve işlevsellik için bazı PHP uzantılarına ihtiyaç duyar; örneğin
event
uzantısı (kuruluysa otomatik öncelikli kullanılır ve daha hızlıdır),posix
vepcntl
(çoklu süreçler için). ServBay’de sık kullanılan çoğu uzantı varsayılan açık gelir; özel sorunlarda panelden ilgili PHP eklentisinin etkin olup olmadığını kontrol edin. - Loglar: Daemon modunda çıktılar log dosyasına yönlendirilir. Uygulamanızın durumunu ve olası hataları düzenli olarak loglardan takip edin.
Sıkça Sorulan Sorular (SSS)
- S: Workerman sunucusunu nasıl durdururum?
- C: Sunucu ön planda çalışıyorsa (
start
komutu), terminaldeCtrl+C
ile durdurabilirsiniz. Arka planda daemon modunda çalışıyorsa (start -d
komutu), projedeki ilgili dosyadaphp your_server_file.php stop
komutu ile sonlandırabilirsiniz.
- C: Sunucu ön planda çalışıyorsa (
- S: Workerman sunucusu neden başlamıyor?
- C: En yaygın sebep portun başka bir uygulama tarafından kullanılmasıdır. Terminaldeki hata mesajını kontrol edin; genelde port kullanımına dair bilgi verir. Farklı bir port seçebilir veya ilgili portu kullanan uygulamayı kapatabilirsiniz. Hangi sürecin portu kullandığını
lsof -i :port_no
komutu ile görebilirsiniz.
- C: En yaygın sebep portun başka bir uygulama tarafından kullanılmasıdır. Terminaldeki hata mesajını kontrol edin; genelde port kullanımına dair bilgi verir. Farklı bir port seçebilir veya ilgili portu kullanan uygulamayı kapatabilirsiniz. Hangi sürecin portu kullandığını
- S: ServBay’in Caddy/Nginx’i ile Workerman’ın farkı nedir? Hangisini kullanmalıyım?
- C: ServBay’in Caddy/Nginx’i, geleneksel HTTP/HTTPS isteklerini karşılayan tipik web sunucularıdır ve genellikle PHP-FPM ile işlem görür; istek tamamlanınca süreç sonlanır. Workerman ise bir PHP asenkron ağ çatısı olarak HTTP, WebSocket, TCP gibi protokolleri kendi başına işleyebilir, süreçleri kalıcı çalışır ve yüksek eşzamanlı, uzun ömürlü veya gerçek zamanlı uygulamalar için daha uygundur. Tercihiniz ihtiyacınıza bağlı: klasik web sitesi veya RESTful API için Caddy/Nginx; sohbet, oyun, IoT gibi anlık etkileşimler için Workerman. Elbette, Caddy/Nginx’i proxy olarak yapılandırıp Workerman’ı destekleyebilirsiniz.
- S: ServBay’de birden fazla Workerman uygulamasını aynı anda çalıştırabilir miyim?
- C: Evet. Her Workerman uygulaması için ayrı bir PHP süreci/port gerekir. Her bir uygulamanız için ayrı bir dosya ve terminalde
php your_app_server.php start
(veya arka planda) çalıştırmanız yeterlidir. Portların çakışmamasına dikkat edin.
- C: Evet. Her Workerman uygulaması için ayrı bir PHP süreci/port gerekir. Her bir uygulamanız için ayrı bir dosya ve terminalde
Özet
Bu rehber ile, ServBay’in yüksek verimli yerel geliştirme ortamında Workerman projelerini hızlı ve zahmetsizce nasıl kurup çalıştıracağınızı öğrendiniz. Workerman’ın yüksek performansı ve asenkron özelliği, PHP geliştiricilerine yeni nesil ağ uygulamalarını hayata geçirme konusunda büyük avantajlar sunar. ServBay’in hazır Composer ve PHP ortamı, geliştirme hızınızı artırıp ortam kurulumuna zaman harcatmaz; sadece iş mantığına odaklanırsınız. İster yüksek verimli Web servisleri, ister gerçek zamanlı WebSocket uygulamaları geliştirin; ServBay, Workerman ile yerel geliştirmede ideal ortağınız olacaktır. Umarız bu doküman Workerman dünyasını keşfetmenize fayda sağlar!