ServBay'de Workerman Uygulamaları Kurma ve Çalıştırma
Genel Bakış
Bu doküman, ServBay kullanıcılarının macOS yerel geliştirme ortamında, ServBay'in entegre PHP ortamı ve Composer desteğinden yararlanarak, Workerman tabanlı yüksek performanslı asenkron ağ uygulamalarını hızlıca nasıl kurabileceğini ve çalıştırabileceğini kapsamlı şekilde açıklamaktadır. Workerman, Web sunucuları, gerçek zamanlı iletişim sunucuları, oyun sunucuları gibi yüksek eşzamanlılık gerektiren farklı ağ servislerinin kurulumuna uygun güçlü bir PHP kütüphanesidir. ServBay'in sağladığı hazır kurulu geliştirme platformu, Workerman ortamını yapılandırmayı oldukça basit hale getirir.
Workerman Nedir?
Workerman, tamamen PHP ile yazılmış, açık kaynaklı, yüksek performanslı bir asenkron ağ iletişim çerçevesidir. EventLoop (Olay Döngüsü) mekanizmasına dayanarak asenkron ve engellenmeyen I/O işlemleriyle çok sayıda eşzamanlı bağlantıyı verimli şekilde işler. Geleneksel PHP Web geliştirme modeli (ör. Apache/Nginx + PHP-FPM) ile kıyaslandığında, Workerman uygulamaları tipik olarak bellekte sürekli çalışır, belirli portları dinler ve doğrudan ağ bağlantılarını işleyerek her bir istek sonrası işlemci sonlandırma/kaynak kullanımı gibi maliyetleri ortadan kaldırır. Böylelikle performans ve veri işleme kapasitesi ciddi şekilde artar.
Workerman ile geliştiriciler kolaylıkla şunları inşa edebilir:
- Apache/Nginx'i temel işlemlerde ikame edebilecek yüksek performanslı HTTP sunucuları.
- Sohbet odaları, gerçek zamanlı veri aktarımları gibi senaryolara yönelik canlı WebSocket sunucuları.
- Farklı protokollerde özelleştirilebilen TCP/UDP sunucuları.
- Komut satırı araçları, zamanlanmış görevler ve mikroservisler gibi çeşitli yardımcı yazılımlar.
Workerman'ın Temel Özellikleri ve Avantajları
- Yüksek Performans: Çekirdeği olay odaklı ve asenkron- engellenmeyen I/O tabanlıdır. Yüzbinlerce eşzamanlı bağlantıyı işleyebilir.
- Çoklu Protokol Desteği: HTTP, WebSocket, TCP, UDP gibi yaygın ağ protokollerini gömülü olarak destekler; ayrıca geliştiricilerin kolayca özel protokoller tanımlamasına olanak tanır.
- Kullanım Kolaylığı: Basit ve sezgisel API üzerinden, asenkron ağ programlamanın karmaşıklığını azaltır ve PHP geliştiricileri hızlıca adapte olabilir.
- Esnek Genişleme: Çoklu işlem modeli ile çok çekirdekli CPU olanaklarından faydalanarak, yatay olarak kolayca ölçeklenebilir ve yük dengeleyebilir. Composer paketleri ve mevcut PHP kütüphaneleriyle kolayca entegre olur.
- PHP Ekosistemiyle Entegrasyon: Sıradan bir PHP kütüphanesi gibi Composer ile kolayca yönetilebilir, mevcut PHP ekosistemiyle tam uyumludur.
- Daemon (Servis) Modu: Arka planda servis olarak stabil biçimde çalışmayı destekler, üretim ortamlarında kesintisiz hizmet sağlar.
Workerman, PHP geliştiricilerine yüksek performanslı, gerçek zamanlı ve yüksek eşzamanlı uygulamaların önünü açan güçlü bir araçtır.
ServBay ile Workerman Geliştirme Ortamı Kurmak
ServBay, Web geliştiricileri için özel tasarlanmış, PHP, Node.js, Python, Go, Java gibi popüler çalışma zamanlarını; Caddy, Nginx, Apache, MySQL, PostgreSQL, MongoDB, Redis, Memcached gibi yaygın veritabanları ve sunucu yazılımlarını bir arada sunan gelişmiş bir yerel geliştirme ortamı aracıdır. “Kutudan çıktığı gibi kullanılabilir” avantajıyla öne çıkar. Özellikle entegre ve yapılandırılmış Composer ortamı, ServBay’de Workerman projelerini kurmak ve çalıştırmak için ciddi kolaylık sağlar.
Bu rehber, ServBay üzerinde basit bir HTTP sunucusu, WebSocket sunucusu ve TCP sunucusu olmak üzere temel Workerman örneklerini adım adım oluşturmayı ve çalıştırmayı gösterecektir.
TIP
Projelerinizi düzenli ve yönetilebilir kılmak için, ServBay tüm yerel site dosyalarının /Applications/ServBay/www
dizininde tutulmasını önerir. Bu dokümandaki tüm örnek yollar bu dizin üzerinden verilecektir.
Gereksinimler
Başlamadan önce aşağıdaki koşulların sağlanmış olduğundan emin olun:
- ServBay Yüklendi ve Çalışıyor: ServBay Resmi Sitesinden son sürümü indirip kurun.
- ServBay'de PHP Etkin: ServBay kontrol panelinde kullanmak istediğiniz PHP sürümünün etkin olduğundan emin olun. Workerman için minimum PHP 5.4 gerekir, PHP 7.x veya 8.x önerilir.
- Temel PHP ve Komut Satırı Bilgisi: Temel PHP sözdizimi ve terminal/komut satırı kullanımı hakkında bilginiz olmalı.
Workerman Kurulumu
1. Composer’ın Kullanılabilirliğini Kontrol Edin
ServBay entegre Composer ile gelir, ekstra kurulum gerekmez. Sadece ServBay’in başlatılmış ve istediğiniz PHP sürümünün etkinleştirilmiş olduğundan emin olun. Composer doğrudan ServBay’in terminalinden veya (Sistem PATH’e eklendiyse) harici terminalden kullanılabilir.
Terminalde şu komutla Composer’ın erişilebilir olup olmadığını kontrol edebilirsiniz:
composer -v
Composer doğru şekilde kurulmuşsa, versiyon bilgilerinin listelendiğini göreceksiniz. Komut bulunamazsa, ServBay’in çalışıp çalışmadığını ve PHP’nin etkin olup olmadığını kontrol edin.
2. Proje Dizinini Oluşturun
ServBay’in önerilen web dizinine gidin ve yeni bir proje klasörü oluşturup içeri girin:
cd /Applications/ServBay/www
mkdir servbay-workerman-demo
cd servbay-workerman-demo
2
3
Burada servbay-workerman-demo
adında Workerman projelerinizi barındıracak bir klasör oluşturduk.
3. Composer ile Workerman Kurulumu
Şimdi proje dizininde (/Applications/ServBay/www/servbay-workerman-demo
) Composer ile Workerman kütüphanesini kurun:
composer require workerman/workerman
Composer, Workerman ve bağımlılıklarını otomatik olarak vendor
klasörüne indirecek.
Workerman HTTP Sunucu Kodu Yazmak
HTTP sunucusu, Workerman’ın en sık kullanılan uygulama alanlarından biridir ve yüksek performanslı Web uygulamaları veya API servisleri oluşturmak için kullanılır.
Proje dizininde http_server.php
(veya server.php
gibi istediğiniz başka bir isimle) adlı bir dosya oluşturun ve şu PHP kodunu ekleyin:
<?php
// Composer'ın otomatik yükleyicisini dahil et; böylece Workerman sınıfları kullanılabilir
require __DIR__ . '/vendor/autoload.php';
// Workerman'ın Worker sınıfını ve ilgili sınıfları içe aktar
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
// Worker örneği oluştur, dinlenecek protokol ve adresi belirt
// 'http://0.0.0.0:8080', tüm arayüzlerde (0.0.0.0) 8080 portunda HTTP sunucusu açar
// 0.0.0.0 ile hem yerel hem de ağdaki diğer cihazlardan erişim sağlanır; 8080, dinlenen porttur.
$http_worker = new Worker('http://0.0.0.0:8080');
// İşlem (worker) sayısını ayarla
// Burada 4 olarak belirlenmiştir; her biri talepleri işleyecek 4 ayrı PHP işlemi oluşur. CPU çekirdek sayınıza göre ayarlanabilir.
$http_worker->count = 4;
// İstemciden gelen (HTTP isteği) mesaj alındığında çalışacak işle
// $connection: mevcut bağlantı nesnesi, yanıt göndermek için kullanılır
// $request: isteğin detaylarını (URL, Başlıklar, Gövde vs.) içerir
$http_worker->onMessage = function(TcpConnection $connection, Request $request) {
// İstemciye basit bir dizeyi HTTP yanıtı olarak gönder
// Workerman, HTTP başlıkları ve diğer teknik detayları otomatik yönetir
$connection->send(new Response(200, [], 'Hello ServBay Workerman HTTP Server!'));
};
// Tüm Worker örneklerini çalıştır
// Bu, Workerman'ın ana döngüsünü başlatır; Worker işlemleri dinlemeye ve olayları işlemeye başlar
Worker::runAll();
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çıklamaları:
require __DIR__ . '/vendor/autoload.php';
: Composer’ın yükleyici dosyasını içe alır, böylece Workerman sınıfları (ör.Worker
,Request
,Response
) yüklenir.use Workerman\...;
: Gerekli sınıfları çağırır.new Worker('http://0.0.0.0:8080')
: Workerman örneği oluşturur; protokol (http
) ve adres (0.0.0.0:8080
) belirtilir.$http_worker->count = 4;
: Worker işlemi sayısını belirler. Fazla işlem çok çekirdekli CPU’da daha yüksek eşzamanlılık sağlar.$http_worker->onMessage = function(...) {...};
: Gelen, tamamlanmış HTTP isteklerinde çağrılır.$connection
: yanıt göndermek için;$request
: istemciden gelen istek bilgilerini içerir.Response
ile standart HTTP yanı oluşturulur.Worker::runAll();
: Workerman olay döngüsünü ve tanımlanan tüm Worker süreçlerini başlatır.
Workerman HTTP Sunucusunu Başlatmak
Proje dizininde (/Applications/ServBay/www/servbay-workerman-demo
) terminali açıp aşağıdaki komutla HTTP sunucusunu başlatın:
php http_server.php start
Çalıştırma Modları Açıklaması:
- Ön Yüz Modu (Foreground):
php http_server.php start
çalıştırıldığında, Workerman ön yüzde (terminalde) çalışır, işlem ve günlükler görüntülenir. Sunucuyu kapatmak içinCtrl+C
tuşlamanız yeterli olur. Geliştirme ve hata ayıklama için bu mod idealdir. - Daemon (Servis) Modu: Üretim ortamında, Workerman’ın arka planda hizmet olarak çalışması için
-d
parametresiyle başlatılır:bashÇıktılar otomatik olarak günlük (log) dosyalarına yönlendirilir (varsayılan olarak Workerman dizini veya belirttiğiniz yol).php http_server.php start -d
1
İşlem Yönetimi:
Workerman şu kolay işlem yönetim komutlarını destekler:
- Başlatma:
php http_server.php start
(ön yüzde) veyaphp http_server.php start -d
(arka planda) - Durdurma:
php http_server.php stop
(işlemdeki tüm istekler bittiğinde şıkça kapatır) - Yeniden Başlatma:
php http_server.php restart
(durdurup başlatır) - Yumuşak Yeniden Başlatma (Reload):
php http_server.php reload
(genellikle kod değişimlerinde; alt işlemler tek tek yeniden başlatılır, servis kesintisiz devam eder; ancakonWorkerStart
gibi yaşam döngüsü fonksiyonlarının etkilerine dikkat) - Durum İzleme:
php http_server.php status
(çalışma durumu, bellek kullanımı, bağlantı sayısı vs. gösterir)
Sunucuyu başlattıktan sonra, tarayıcınızda http://localhost:8080
veya http://127.0.0.1:8080
adresini açarsanız, ekranda Hello ServBay Workerman HTTP Server!
yazdığını göreceksiniz.
Workerman ile WebSocket Sunucusu Oluşturmak
WebSocket protokolü, istemci ile sunucu arasında kalıcı çift yönlü bir bağlantı sağlar; online sohbet, canlı veri akışı, oyun gibi gerçek zamanlı uygulamalar için idealdir. Workerman, WebSocket’i güçlü şekilde destekler.
WebSocket Sunucu Kodunu Oluşturun
Proje dizininde
websocket_server.php
adında bir dosya oluşturup aşağıdaki kodu ekleyin:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // WebSocket sunucusu örneği oluştur ve 8081 portunu dinle // 'websocket://0.0.0.0:8081' ile WebSocket sunucusu başlatılır // Workerman, el sıkışma (handshake) işlemini otomatik yönetir $ws_worker = new Worker('websocket://0.0.0.0:8081'); // 4 işlem başlat $ws_worker->count = 4; // Bağlantı kurulduğunda çalışacak işle $ws_worker->onConnect = function(TcpConnection $connection) { echo "Yeni WebSocket bağlantısı: " . $connection->getRemoteIp() . "\n"; }; // Mesaj alındığında çalışacak işle // $data: istemciden alınan mesaj (decode edilmiş) $ws_worker->onMessage = function(TcpConnection $connection, $data) { echo "Mesaj alındı: " . $data . "\n"; // İstemciye gelen mesajı geriye yolla (echo) $connection->send('ServBay Workerman aldı: ' . $data); }; // Bağlantı kapandığında çalışacak işle $ws_worker->onClose = function(TcpConnection $connection) { echo "WebSocket bağlantısı kapatıldı\n"; }; // Hata oluştuğunda çalışacak işle (opsiyonel) $ws_worker->onError = function(TcpConnection $connection, $code, $msg) { echo "Hata: $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
40WebSocket Sunucusunu Çalıştırın
Proje dizininde şu komutu kullanarak WebSocket sunucusunu başlatın:
bashphp websocket_server.php start
1Aynı şekilde
-d
parametresiyle arka planda da çalıştırılabilir. Sunucu başlatıldıktan sonra, herhangi bir WebSocket istemcisi ilews://localhost:8081
adresine bağlanabilirsiniz.Örneğin, tarayıcı geliştirici araçlarının Konsol’unda şu 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("Tarayıcıdan selam!"); // Mesaj gönder }; ws.onmessage = function(event) { console.log("Sunucudan mesaj:", event.data); // Mesaj alındığında }; ws.onclose = function(event) { if (event.wasClean) { console.log("WebSocket düzgün kapandı, kod=" + event.code + " neden=" + event.reason); } else { console.error("WebSocket bağlantısı kapandı"); } }; ws.onerror = function(error) { console.error("WebSocket hatası:", error); }; // Bağlantı kapama (opsiyonel) // 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ıyla bağlandıktan sonra, terminalde bağlantı çıktısını; mesaj gönderip aldıkça terminalde iletileri ve tarayıcıda da sunucunun yanıtladığı mesajları göreceksiniz.
Workerman ile TCP Sunucusu Oluşturmak
Workerman ayrıca, TCP tabanlı herhangi bir üst katman protokolünü işlemek için genel amaçlı TCP sunucuları kurabilir. Bu; oyun sunucuları arka planı, IoT platformları, özel iletişim servisleri gibi pek çok alanda kullanılabilir.
TCP Sunucu Kodunu Oluşturun
Proje dizininde
tcp_server.php
adında bir dosya oluşturup şu kodu ekleyin:php<?php require __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\TcpConnection; // 8082 portunu dinleyen bir TCP sunucusu oluştur // 'tcp://0.0.0.0:8082' ile TCP sunucusu başlatılır // Varsayılan text protokolü (satır sonu '\n') kullanılır; farklı ya da özel protokol belirtilmesi mümkündür $tcp_worker = new Worker('tcp://0.0.0.0:8082'); // 4 işlem başlat $tcp_worker->count = 4; // Bağlantı kurulduğunda çalışacak işle $tcp_worker->onConnect = function(TcpConnection $connection) { echo "Yeni TCP bağlantısı: " . $connection->getRemoteIp() . "\n"; // Bağlantı kurulduğunda hoş geldiniz mesajı gönder $connection->send("ServBay Workerman TCP Sunucusuna Hoş Geldiniz!\n"); }; // Mesaj alındığında çalışacak işle // $data: istemciden alınan ham TCP verisi (protokole uygun biçimde ayrıştırılmış) $tcp_worker->onMessage = function(TcpConnection $connection, $data) { echo "Veri alındı: " . $data; // İstemciye alınan veriyi geri gönder $connection->send('ServBay Workerman aldı: ' . $data); }; // Bağlantı kapandığında çalışacak işle $tcp_worker->onClose = function(TcpConnection $connection) { echo "TCP Bağlantısı kapatıldı\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 Çalıştırın
Proje dizininde şu komutla TCP sunucusunu başlatın:
bashphp tcp_server.php start
1Yine
-d
parametresiyle arka planda da çalıştırılabilir. Sunucuyu başlattıktan sonra, herhangi bir TCP istemci aracı ilelocalhost:8082
'ye bağlanabilirsiniz.Örneğin, macOS/Linux’ta ayrı bir terminal penceresinde
telnet
veyanc
kullanarak:bash# telnet ile telnet localhost 8082 # veya nc (netcat) ile nc localhost 8082
1
2
3
4
5Bağlantı kurulduğunda, sunucunun hoş geldiniz mesajını görebilirsiniz. Herhangi bir metin yazıp enter'a bastığınızda (standart text protokolünde satır sonu ile), sunucu gönderdiğiniz mesajı geri iletecektir.
Dikkat Edilmesi Gerekenler
- Port Kullanımı: Workerman’ın dinlediği portların (ör. 8080, 8081, 8082) macOS’ta ya da ServBay üzerinde çalışan diğer yazılımlar tarafından kullanılmadığından emin olun. Port çakışması olursa Workerman başlatılamaz ve hata verir.
lsof -i :PORTNUMARASI
komutu ile portun kimde olduğunu görebilirsiniz. - Güvenlik Duvarı: macOS’un yerleşik güvenlik duvarı, dış cihazların bu portlara bağlanmasını engelleyebilir. Geliştirme ortamında genellikle sorun olmaz, ancak ağdaki diğer cihazlardan erişmek için macOS güvenlik duvarı ayarlarını gözden geçirin.
- ServBay Web Sunucusu ile İlişki: Workerman kendi dinlediği portlarda bağımsız çalışır ve ServBay’in içindeki Caddy ya da Nginx ile ayrı süreçlerdir. Genellikle, Workerman doğrudan bağlantı işler (proxy gerektirmez); yalnızca özel proxy ihtiyacı durumunda Caddy/Nginx ile yönlendirme yapılabilir. Workerman, uzun süreli bağlantı ya da yüksek eşzamanlı/gerçek zamanlı işlemler için (ör. WebSocket) daha uygundur; ServBay’in Caddy/Nginx servisleri ise klasik HTTP/Vekil talepleri için idealdir.
- PHP Sürümü: Workerman’ın gereksinimlerini karşıladığından emin olun. ServBay birden fazla PHP sürümüyle gelir; projenize uygun olanı ServBay kontrol panelinden seçip etkinleştirebilirsiniz.
- Eklenti Bağımlılıkları: Workerman, en iyi performans için bazı PHP eklentilerini (ör.
event
— kurulu ve etkinse ilk olarak onu kullanır, daha yüksek performans sağlar;posix
,pcntl
— çoklu işlem modelleri için) kullanır. ServBay, çoğu yaygın eklentiyi varsayılan olarak etkinleştirir. Beklenmedik hata durumlarında, ServBay panelinden gerekli PHP eklentilerinin etkinliğini kontrol edin. - Günlükler: Daemon modunda, Workerman’ın çıktıları günlük dosyalarına yönlendirilir. Uygulamanın durumu ve olası hatalar için günlükleri düzenli izlemeniz önerilir.
Sıkça Sorulan Sorular (SSS)
- S: Workerman Sunucusunu Nasıl Durdurabilirim?
- C: Sunucu ön yüzde ise (
start
komutu ile), terminaldeCtrl+C
tuşuna basın. Arka planda (daemon modunda) ise, proje dizinindephp your_server_file.php stop
komutunu kullanın.
- C: Sunucu ön yüzde ise (
- S: Workerman Sunucusu Neden Başlatılamıyor?
- C: En yaygın sebep, dinlenmek istenen portun başka bir yazılım tarafından kullanılmasıdır. Terminaldeki hata mesajını inceleyin, genellikle portun meşgul olduğunu belirtecektir. Başka bir port deneyin veya ilgili programı kapatın.
lsof -i :PORTNUMARASI
ile hangi sürecin portu işgal ettiğini öğrenebilirsiniz.
- C: En yaygın sebep, dinlenmek istenen portun başka bir yazılım tarafından kullanılmasıdır. Terminaldeki hata mesajını inceleyin, genellikle portun meşgul olduğunu belirtecektir. Başka bir port deneyin veya ilgili programı kapatın.
- S: ServBay’deki Caddy/Nginx ile Workerman Arasında Ne Fark Var? Hangisini Kullanmalıyım?
- C: ServBay’in Caddy/Nginx’i klasik Web sunucusudur; standart HTTP/HTTPS isteklerini işler, genellikle PHP-FPM ile birlikte çalışır. Her istek sonrası PHP işlemi sonlanabilir. Workerman, asenkron bir PHP ağ çerçevesidir; hem HTTP sunucusu olarak çalışabilir, hem de WebSocket, TCP gibi farklı protokolleri işleyebilir. Sürekli bellekte çalışır, yüksek eşzamanlılık ve uzun bağlantılar için çok daha uygundur. Projenize göre seçim yapın: Klasik web siteleri veya REST API'ler için Caddy/Nginx; canlı sohbet, oyun arkası, IoT servisleri için Workerman idealdir. Her ikisi birlikte de çalışabilir: örneğin, Caddy/Nginx'i belirli istekleri Workerman'a yönlendiren bir reverse proxy olarak konumlandırabilirsiniz.
- S: ServBay’de Birden Fazla Workerman Uygulamasını Aynı Anda Çalıştırabilir miyim?
- C: Evet. Her Workerman uygulaması için ayrı bir PHP işleminde, farklı portlarda çalıştırılmalı. Her uygulama için bağımsız başlatma betiği oluşturup, farklı terminal pencerelerinde veya arka planda
php your_app_server.php start
komutu ile başlatabilirsiniz. Sadece portlarınızın çakışmadığından emin olun.
- C: Evet. Her Workerman uygulaması için ayrı bir PHP işleminde, farklı portlarda çalıştırılmalı. Her uygulama için bağımsız başlatma betiği oluşturup, farklı terminal pencerelerinde veya arka planda
Sonuç
Bu rehberde, ServBay'in verimli yerel geliştirme ortamında Workerman projelerini hızlıca kurmayı ve çalıştırmayı öğrendiniz. Workerman’ın performansı ve asenkron yapısı, PHP geliştiricilerine yeni nesil ağ uygulamaları inşa etme imkânı sunuyor. ServBay’in entegre Composer ve PHP ortamı sayesinde, karmaşık ayarlamalara vakit harcamadan, doğrudan Workerman uygulamanızın iş mantığına odaklanabilirsiniz. Yüksek performanslı web servisleri ya da gerçek zamanlı WebSocket uygulamaları geliştirmeyi planlıyorsanız, ServBay Workerman için ideal bir yerel geliştirme çözümüdür. Bu rehber, Workerman dünyasına sorunsuz bir başlangıç yapmanız için size yol gösterici olacaktır!