ServBay'de Webman Projesi Oluşturma ve Çalıştırma
Webman Nedir?
Webman, yüksek eşzamanlılık ve performans gerektiren web uygulamaları oluşturmak için tasarlanmış, Workerman tabanlı bir PHP asenkron web çerçevesidir. Geleneksel, senkron ve engelleyici framework'lerden farklı olarak Webman, olay tabanlı ve asenkron, engellemeyen I/O modelini kullanır. Bu sayede çok sayıda eşzamanlı isteği etkin bir şekilde işleyebilir. Webman basit ve kullanışlı bir API ile esnek eklenti destekleri sunar; gerçek zamanlı uygulamalar, API servisleri, mikroservisler gibi projelerde rahatlıkla kullanılabilir.
Webman'ın Başlıca Özellikleri ve Avantajları
- Yüksek Performans: Workerman altyapısıyla, olay yönelimli ve asenkron I/O sayesinde milyonlarca eşzamanlı bağlantıyı verimli şekilde yönetir; geleneksel senkron framework'lerden çok daha yüksek bir işlem kapasitesine sahiptir.
- Kullanım Kolaylığı: Basit, sezgisel API'leri ve fonksiyon zenginliği sayesinde geliştiriciler hızlıca uygulama geliştirebilir.
- Çoklu Protokol Desteği: HTTP, WebSocket gibi birçok yaygın uygulama katmanı protokolünü yerleşik olarak sunar, farklı türde servisler geliştirmeyi kolaylaştırır.
- Esnek Genişletme: Composer paketleri, eklentiler ve middleware mekanizmaları üzerinden framework işlevlerini rahatça geliştirebilirsiniz.
- Düşük Kaynak Tüketimi: Webman, klasik web sunucusu + PHP-FPM modelinin aksine, bellekte sürekli çalışan bir uygulamadır ve kaynak kullanımı düşüktür.
- Güçlü Topluluk Desteği: Aktif geliştirici topluluğu ve zengin dökümantasyon sayesinde teknik desteğe kolayca ulaşırsınız.
Webman, düşük gecikme ve yüksek eşzamanlılık gerektiren API servisleri ve web uygulamaları için ideal bir gelişme ortamı sunar.
ServBay ile Kolay Webman Projesi Oluşturma ve Çalıştırma
Bu rehberde, ServBay yerel geliştirme ortamında Webman kullanarak örnek bir web projesi oluşturmayı, temel rotalar ve kontrolör kodunu yazmayı, ServBay ile sunulan veritabanı (MySQL, PostgreSQL) ve önbellek servislerini (Redis, Memcached) entegre etmeyi adım adım göstereceğiz.
TIP
ServBay, tüm yerel web sitelerinizin /Applications/ServBay/www dizininde tutulmasını önerir. Böylece ServBay panelinden site yapılandırmasını (eski adıyla "host" ayarlarını) kolayca yönetebilirsiniz.
Ön Gereksinimler
Başlamadan önce aşağıdaki hazırlıkları tamamladığınızdan emin olun:
- ServBay Kurulumu: macOS üzerinde ServBay'i başarıyla kurdunuz. ServBay, PHP, Composer, MySQL, PostgreSQL, Redis, Memcached gibi bu rehberde ihtiyaç duyulan tüm yazılımları paket halinde sunar.
- Gerekli Paketlerin Etkinliği: ServBay kontrol panelinden, aşağıdaki paketlerin kurulu ve çalışır durumda olduğundan emin olun:
- Seçtiğiniz PHP sürümü (En güncel sürümü, ör. PHP 8.x, tavsiye edilir)
- Composer (ServBay ile entegre)
- MySQL
- PostgreSQL
- Redis
- Memcached
- Seçtiğiniz PHP sürümünde,
memcached,redis,pdo_mysql,pdo_pgsqlgibi gerekli PHP uzantılarının etkin olduğunu kontrol edin. ServBay genellikle bu uzantıları varsayılan olarak açar; PHP ayarlarından doğrulayabilirsiniz.
- Terminal Kullanımı: macOS Terminal uygulamasına ve temel komutlara aşinasınız.
Webman Kurulumu
Composer'ın Kullanılabilir Olduğunu Doğrulayın
ServBay, Composer'ı hazır şekilde getirir ve terminalden doğrudan kullanabilirsiniz. Aşağıdaki komutla doğrulama yapın:
bashcomposer --version1Composer sürüm bilgisi doğru görüntüleniyorsa, Composer kullanıma hazır demektir.
ServBay Proje Dizini'ne Geçiş Yapın
Terminali açıp ServBay’in tavsiye edilen web dizinine geçin:
bashcd /Applications/ServBay/www1Composer ile Webman Projesi Oluşturun
Aşağıdaki Composer
create-projectkomutuyla Webman framework'ünü belirtilen ad klasörüne kurun. Projeyiservbay-webman-appolarak isimlendiriyoruz:bashcomposer create-project workerman/webman servbay-webman-app1Composer, Webman ve çekirdek bağımlılıklarını
servbay-webman-appdizinine indirecektir.Proje Dizinine Girin
Kurulum tamamlandıktan sonra ilgili klasöre geçin:
bashcd servbay-webman-app1Gerekli Bileşenleri Kurun
Veritabanı ve önbellek özelliğini gösterebilmek için ek Composer paketleri gereklidir. Webman genellikle
illuminate/database(Laravel’ın veritabanı bileşeni) veilluminate/rediskullanır.-W(--with-dependencies) seçeneği, potansiyel bağımlılık uyuşmazlıklarını çözer.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper1Bu komut; ORM, Redis istemcisi, sayfalama bileşeni, event dispatcher ve hata ayıklama için VarDumper'ı yükler.
Veritabanı ve Tablo Oluşturma
Örnek kodların çalışması için ServBay’deki MySQL ve PostgreSQL veritabanlarında gerekli veritabanı ve users tablosunu oluşturalım. ServBay'de varsayılan root kullanıcı parolası password'dur.
Veritabanı yönetimi için ServBay'in panelinden phpMyAdmin veya pgAdmin web arayüzünü ya da terminal komutlarını kullanabilirsiniz.
webman_appVeritabanı Oluşturma- MySQL:sql
CREATE DATABASE IF NOT EXISTS webman_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;1 - PostgreSQL:sql
CREATE DATABASE webman_app;1
- MySQL:
webman_appVeritabanındausersTablosu Oluşturma- MySQL:sql
USE webman_app; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );1
2
3
4
5
6
7 - PostgreSQL:sql
\c webman_app; -- Yeni veritabanına geçiş CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );1
2
3
4
5
6
7
- MySQL:
Web Proje Kodunu Yazma
Şimdi örnek rotaları, kontrolörleri ve veritabanı/önbellek etkileşimlerini ekleyeceğiz.
Rota Yapılandırması
Proje kök dizinindeki
config/route.phpdosyasına aşağıdaki kodu ekleyin:php<?php use Webman\Route; use app\controller\IndexController; use app\controller\CacheController; use app\controller\DatabaseController; // Ana dizin rotasını tanımlayın, IndexController'ın index metoduna yönlendirir Route::any('/', [IndexController::class, 'index']); // Önbellek ile ilgili rotalar Route::any('/memcached', [CacheController::class, 'memcached']); Route::any('/redis', [CacheController::class, 'redis']); // Veritabanı ile ilgili rotalar Route::any('/mysql-add', [DatabaseController::class, 'mysqlAdd']); Route::any('/mysql', [DatabaseController::class, 'mysqlGet']); Route::any('/pgsql-add', [DatabaseController::class, 'pgsqlAdd']); Route::any('/pgsql', [DatabaseController::class, 'pgsqlGet']); // Buraya başka rotalar ekleyebilirsiniz...1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Kontrolör Dosyalarını Oluşturun
app/controllerdizinindeIndexController.php,CacheController.phpveDatabaseController.phpdosyalarını oluşturun ve karşılık gelen kodları ekleyin.app/controller/IndexController.php: Ana sayfa isteklerini işler.php<?php namespace app\controller; use support\Request; use support\Response; // Response sınıfını ekleyin class IndexController { /** * Ana dizin isteklerini işleyen örnek metod * @param Request $request Mevcut istek nesnesi * @return Response Bir Response nesnesi dönüşü */ public function index(Request $request): Response // Tip dönüşü net { // Basit bir metin cevabı döndürür return response('Hello ServBay & Webman!'); // Hoş geldiniz mesajı } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20app/controller/CacheController.php: Memcached ve Redis kullanımını gösterir.php<?php namespace app\controller; use support\Request; use support\Response; use Memcached; // Memcached sınıfı use support\Redis; // Webman'ın Redis Facade'ı class CacheController { /** * Memcached kullanım örneği * @param Request $request * @return Response */ public function memcached(Request $request): Response { // Memcached sunucusuna bağlan, ServBay varsayılanı 127.0.0.1:11211 $memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211); // Anahtarı ayarla, 60 saniye süreli $success = $memcached->set('servbay_key', 'Hello Memcached from ServBay!', 60); // Anahtar ve değer güncellendi if (!$success) { return response('Memcached anahtarı ayarlanamadı', 500); } // Anahtarı getir $value = $memcached->get('servbay_key'); // Anahtar güncellendi // Sonucu döndür return response($value ?: 'Memcached anahtarı bulunamadı veya süresi doldu'); // Bulunamazsa uyarı } /** * Redis kullanım örneği * @param Request $request * @return Response */ public function redis(Request $request): Response { // Redis Facade ile anahtar ayarla Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // Anahtar ve değer güncellendi // Anahtarı getir $value = Redis::get('servbay_redis_key'); // Anahtar güncellendi // Sonucu döndür return response($value ?: 'Redis anahtarı bulunamadı'); // Bulunamazsa uyarı } }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
43
44
45
46
47
48
49
50
51
52app/controller/DatabaseController.php: MySQL ve PostgreSQL işlemlerini gösterir.php<?php namespace app\controller; use support\Request; use support\Response; use support\Db; // Webman’ın Db Facade’ı class DatabaseController { /** * MySQL veritabanına kullanıcı ekleme * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // 'mysql' bağlantısıyla tabloya veri ekle Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // Örnek veri 'email' => 'mysql_demo@servbay.test', // Örnek e-posta 'created_at' => date('Y-m-d H:i:s') // Tarih ekle ]); return response('Kullanıcı MySQL’e eklendi'); // Yanıt mesajı } catch (\Exception $e) { return response('MySQL’e kullanıcı eklenirken hata: ' . $e->getMessage(), 500); // Hata yönetimi } } /** * MySQL veritabanından kullanıcıları getirme * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // 'mysql' bağlantısıyla tüm kullanıcıları getir $users = Db::connection('mysql')->table('users')->get(); // JSON olarak döndür return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Content-Type açık } catch (\Exception $e) { return response('MySQL’den kullanıcılar getirilemedi: ' . $e->getMessage(), 500); // Hata yönetimi } } /** * PostgreSQL veritabanına kullanıcı ekleme * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // 'pgsql' bağlantısıyla tabloya veri ekle Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', // Örnek veri 'email' => 'pgsql_demo@servbay.test', // Örnek e-posta 'created_at' => date('Y-m-d H:i:s') // Tarih ekle ]); return response('Kullanıcı PostgreSQL’e eklendi'); // Yanıt mesajı } catch (\Exception $e) { return response('PostgreSQL’e kullanıcı eklenirken hata: ' . $e->getMessage(), 500); // Hata yönetimi } } /** * PostgreSQL veritabanından kullanıcıları getirme * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // 'pgsql' bağlantısıyla tüm kullanıcıları getir $users = Db::connection('pgsql')->table('users')->get(); // JSON olarak döndür return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Content-Type açık } catch (\Exception $e) { return response('PostgreSQL’den kullanıcılar getirilemedi: ' . $e->getMessage(), 500); // Hata yönetimi } } }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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Veritabanı Bağlantısını Yapılandırma
Kök dizindeki
config/database.phpdosyasını açın ve MySQL ile PostgreSQL için aşağıdaki ayarları yapın. ServBay'de varsayılan veritabanı sunucusu127.0.0.1olup, MySQL için port3306, PostgreSQL için5432, kullanıcı adıroot, parola isepassword'dur.php<?php /** * Veritabanı yapılandırması */ return [ // Varsayılan veritabanı bağlantısı 'default' => 'mysql', // Bağlantı listesi 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // ServBay'in varsayılan MySQL adresi ve portu 'host' => '127.0.0.1', 'port' => 3306, // Oluşturulan veritabanı adı 'database' => 'webman_app', // ServBay'in varsayılan MySQL kullanıcı adı 'username' => 'root', // Varsayılan MySQL parolası 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', // ServBay'in varsayılan PostgreSQL adresi ve portu 'host' => '127.0.0.1', 'port' => 5432, // Oluşturulan veritabanı adı 'database' => 'webman_app', // Varsayılan PostgreSQL kullanıcı adı 'username' => 'root', // Varsayılan PostgreSQL parolası 'password' => 'password', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', // veya require, verify-ca, verify-full ], // Buraya farklı veritabanı bağlantıları ekleyebilirsiniz... ], ];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
43
44
45
46Önemli Not: Gerçek sunucu ortamında, varsayılan veritabanı şifresini kesinlikle değiştirin ve hassas verileri kod içinde açık bırakmayın.
Webman Projesini Çalıştırma
Webman projeleri genellikle kendi start.php dosyasıyla Workerman işlemlerini başlatır. Bu kullanım, klasik Nginx/Apache + PHP-FPM yaklaşımından farklıdır; Webman, bellekte sürekli çalışan asenkron bir uygulamadır.
Proje dizini (/Applications/ServBay/www/servbay-webman-app) altında aşağıdaki komutu çalıştırarak Webman'i başlatın:
bash
php start.php start1
Bu komut sonrası Webman’in başladığına dair bilgiler göreceksiniz; varsayılan olarak HTTP isteklerini 127.0.0.1:8787 adresinden dinler.
- Not: Buradaki
phpkomutunu ServBay’in ortamındaki PHP'yi kullanarak çalıştırıyorsunuz. ServBay, terminal ortamınızı otomatik olarak ayarlayacağı için ekstra bir işlem gerekmez. - Webman’i arka planda çalıştırmak isterseniz:
php start.php start -d - Servisi durdurmak için:
php start.php stop - Yeniden başlatmak için:
php start.php restart - Kesintisiz (sorunsuz) yeniden başlatmak için:
php start.php reload
Projeyi Test Etme
Webman başarıyla 127.0.0.1:8787 adresini dinlemeye başladıysa, aşağıdaki URL’ler üzerinden tarayıcıda çeşitli fonksiyonları test edebilirsiniz:
http://localhost:8787/: EkrandaHello ServBay & Webman!mesajını göreceksiniz.http://localhost:8787/memcached: EkrandaHello Memcached from ServBay!mesajı çıkar. Bu, ServBay’in Memcached servisinin entegre şekilde çalıştığını gösterir.http://localhost:8787/redis: EkrandaHello Redis from ServBay!mesajı çıkar. ServBay’in Redis hizmetinin entegre olarak kullanıldığının göstergesidir.http://localhost:8787/mysql-add: EkrandaKullanıcı MySQL’e eklendimesajı çıkar. MySQL veritabanındakiuserstablosuna bir kayıt eklenir.http://localhost:8787/mysql: Ekranda, MySQL veritabanındakiuserstablosunu JSON formatında görürsünüz.http://localhost:8787/pgsql-add: EkrandaKullanıcı PostgreSQL’e eklendimesajı çıkar. PostgreSQL'dekiuserstablosuna bir kayıt eklenir.http://localhost:8787/pgsql: Ekranda, PostgreSQL veritabanındakiuserstablosunu JSON formatında görürsünüz.
Bu URL’leri kullanırken sorun yaşarsanız, Webman’in terminal çıktısını kontrol edin ve ServBay’deki MySQL, PostgreSQL, Redis, Memcached servislerinin çalıştığından veya PHP uzantılarının etkin olduğundan emin olun.
Sık Sorulan Sorular (SSS)
- S:
php start.php startkomutu bulunamıyor mu?- C: Terminalde bulunduğunuz dizinin
servbay-webman-appolduğunu kontrol edin (cdile geçin). ServBay’in kurduğu PHP’nin PATH’e eklendiğinden emin olun (ServBay bunu otomatik ayarlar).
- C: Terminalde bulunduğunuz dizinin
- S:
localhost:8787adresi bağlantı hatası veriyor mu?- C: Terminaldeki
php start.php startçıktısını inceleyin; hata var mı bakın. Port8787başka bir uygulama tarafından kullanılıyorsa Webman’ınconfig/server.phpdosyasından portu değiştirebilirsiniz.
- C: Terminaldeki
- S: Veritabanı bağlantı hatası mı veriyor?
- C: ServBay’de MySQL ve PostgreSQL servislerinin çalışır olduğundan emin olun.
config/database.phpdosyasında adres, port, veritabanı adı, kullanıcı adı ve parola bilgilerini doğrulayın (varsayılan kullanıcıroot, parolapassword).webman_appveritabanı veuserstablosunun mevcut olduğundan emin olun.
- C: ServBay’de MySQL ve PostgreSQL servislerinin çalışır olduğundan emin olun.
- S: Memcached veya Redis bağlantısı hatalı mı?
- C: ServBay’de Memcached ve Redis servislerinin aktif olduğundan emin olun.
app/controller/CacheController.phpdosyasındaki adres ve portları kontrol edin (varsayılan olarak127.0.0.1:11211ve127.0.0.1:6379). Kullandığınız PHP sürümündememcachedveredisuzantılarının aktif olduğunu kontrol edin.
- C: ServBay’de Memcached ve Redis servislerinin aktif olduğundan emin olun.
Sonuç
Bu adımlar ile ServBay yerel geliştirme ortamında bir Webman projesini başarıyla oluşturup çalıştırdınız; ServBay'in sağladığı tek noktadan kurulum sayesinde Webman ortamını hızlıca ayağa kaldırdınız ve veritabanı ile önbellek entegrasyonunu öğrendiniz. Webman’ın üstün performansı ile ServBay’in pratikliği birleşince, asenkron PHP uygulamalarınızı çok daha hızlı geliştirebilirsiniz. Umarız bu rehber, ServBay ve Webman platformlarını maksimum verimle kullanmanıza yardımcı olur.
