ServBay'de Webman Projesi Oluşturma ve Çalıştırma
Webman Nedir?
Webman, Workerman tabanlı yüksek performanslı bir PHP asenkron web çerçevesidir ve yüksek eşzamanlılık ve performansa sahip web uygulamaları oluşturmak için özel olarak tasarlanmıştır. Geleneksel senkron ve engelleyici çerçevelerden farklı olarak, Webman olay tabanlı ve asenkron, engelleyici olmayan I/O modelini kullanır. Bu sayede çok sayıda isteği aynı anda işlerken olağanüstü bir performans sergiler. Webman, sade ve kullanımı kolay bir API ile birlikte esnek bir eklenti yapısı sunar ve gerçek zamanlı uygulama, API servisleri, mikro servisler ve benzeri projeler için idealdir.
Webman'in Temel Özellikleri ve Avantajları
- Yüksek Performans: Workerman tabanlıdır, olay tabanlı ve asenkron engellemeyen I/O sayesinde çoklu eşzamanlı bağlantıları işler; geleneksel senkron çerçeveleri performans olarak fazlasıyla geride bırakır.
- Kullanım Kolaylığı: Basit ve sezgisel API, zengin fonksiyonlar sayesinde geliştiriciler hızlıca projeye başlayabilir ve uygulama geliştirebilir.
- Çoklu Protokol Desteği: HTTP, WebSocket ve benzeri popüler üst katman protokollerini yerleşik olarak destekler; böylece farklı türde servisler kolayca inşa edilebilir.
- Esnek Genişletilebilirlik: Composer paketleri, eklentiler ya da ara yazılım (middleware) yoluyla çerçeve işlevleri kolayca genişletilebilir.
- Düşük Kaynak Kullanımı: Geleneksel Web sunucusu + PHP-FPM modeline kıyasla, Webman, sürekli bellek içi uygulama olarak çok daha düşük kaynak tüketir.
- Güçlü Topluluk Desteği: Aktif bir geliştirici topluluğuna ve kapsamlı dokümantasyon kaynaklarına sahiptir.
Webman, geliştiricilerin yüksek performanslı ve yüksek kullanılabilirliğe sahip Web uygulamaları ve API servislerini hızlı biçimde inşa etmelerine yardımcı olur. Özellikle yüksek trafikli ve düşük gecikmeli senaryolar için idealdir.
ServBay ile Basit Bir Webman Projesi Oluşturup Çalıştırmak
Bu rehberde, ServBay yerel geliştirme ortamında Webman kullanılarak nasıl basit bir web projesi oluşturulup çalıştırılacağını detaylıca anlatacağız. Webman'ın kurulumu, temel yönlendirme ve kontrolör kodlarının yazılması, ayrıca ServBay'in sunduğu veri tabanı (MySQL, PostgreSQL) ve önbellek servisleri (Redis, Memcached) ile entegrasyonun nasıl yapılacağı gösterilecektir.
TIP
ServBay, tüm yerel web projelerinizin /Applications/ServBay/www
dizininde saklanmasını önerir. Bu sayede, ServBay projeleri merkezi olarak yönetebilir ve yerel web sitesi ayarlarınızı (eski adıyla "hostlar") kolayca gerçekleştirebilirsiniz.
Ön Koşullar
Başlamadan önce lütfen aşağıdakilerin hazır olduğundan emin olun:
- ServBay Kurulu Olmalı: macOS üzerinde ServBay'i başarıyla kurdunuz. ServBay, bu rehberde gerekecek olan PHP, Composer, MySQL, PostgreSQL, Redis ve Memcached gibi tüm yazılımları tek paket halinde sunar.
- Gerekli Paketleri Etkinleştirme: ServBay kontrol panelinden aşağıdaki paketlerin kurulu ve çalışır olduğundan emin olun:
- Seçtiğiniz PHP sürümü (Yeni sürümler tavsiye edilir, ör. PHP 8.x)
- Composer (ServBay ile birlikte gelir)
- MySQL
- PostgreSQL
- Redis
- Memcached
- Seçtiğiniz PHP sürümünde
memcached
,redis
,pdo_mysql
,pdo_pgsql
gibi gerekli PHP uzantılarının etkin olduğuna dikkat edin. ServBay genellikle bu uzantıları varsayılan olarak açar; PHP yapılandırmasında kontrol edebilirsiniz.
- Terminal Erişimi: macOS'un terminal uygulamasını kullanabilmeli ve temel komutlara hâkim olmalısınız.
Webman Kurulumu
Composer'ın Kullanılabilirliğini Onaylayın
ServBay, Composer'ı ön yüklü olarak sunar ve terminalde doğrudan kullanıma hazırdır. Aşağıdaki komutla kontrol edebilirsiniz:
bashcomposer --version
1Composer sürüm bilgisini görüyorsanız Composer kullanıma hazır demektir.
ServBay Web Dizinine Girin
Terminali açın ve önerilen web kök dizinine gidin:
bashcd /Applications/ServBay/www
1Composer ile Webman Projesi Oluşturun
Composer'ın
create-project
komutunu kullanarak Webman çerçevesini belirttiğiniz dizine kurun. Projeyiservbay-webman-app
adıyla oluşturacağız:bashcomposer create-project workerman/webman servbay-webman-app
1Composer, Packagist'ten Webman ve gerekli bağımlılıkları
servbay-webman-app
klasörüne indirecektir.Proje Dizinine Girin
Kurulum tamamlandığında yeni oluşturulan proje klasörüne geçin:
bashcd servbay-webman-app
1Gerekli Ek Paketleri Kurun
Veritabanı ve önbellekleme fonksiyonlarını gösterebilmek için bazı ek Composer paketleri yüklememiz gerekiyor. Webman genellikle
illuminate/database
(Laravel’in DB bileşeni),illuminate/redis
vb. kullanır.-W
bayrağı (--with-dependencies
), bağımlılık çakışmalarını çözmek için kullanılır ve uyumluluk sağlar.bashcomposer require -W illuminate/database illuminate/redis illuminate/pagination illuminate/events symfony/var-dumper
1Bu komut; veri tabanı ORM, Redis istemcisi, sayfalama modülü, olay yöneticisi ve hata ayıklama için VarDumper'ı yükleyecektir.
Veritabanı ve Tablo Oluşturma
Örnek kodun çalışması için ServBay'deki MySQL ve PostgreSQL veritabanlarında gerekli veritabanı ve users
tablosunu oluşturmanız gerekir. ServBay'in varsayılan root
kullanıcı şifresi password
'dur.
ServBay’in sunduğu phpMyAdmin veya pgAdmin (ServBay kontrol panelinden erişebilirsiniz) gibi araçlarla veya komut satırı ile aşağıdaki SQL komutlarını çalıştırabilirsiniz.
webman_app
Adında Veritabanı 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_app
Veritabanındausers
Tablosu 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 oluşturulan veritabanına bağlanın 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 Kodlarını Yazma
Şimdi, yönlendirmeler oluşturacak, kontrolörleri ekleyecek ve veri tabanı ile önbellek etkileşimini çalıştıracak kodları yazmaya başlayalım.
Yönlendirmeleri Ayarlama
Proje ana dizinindeki
config/route.php
dosyasını açıp aşağıdaki satırları ekleyin:php<?php use Webman\Route; use app\controller\IndexController; use app\controller\CacheController; use app\controller\DatabaseController; // Ana yol için yönlendirme, IndexController'ın index metoduna yönlendirilir Route::any('/', [IndexController::class, 'index']); // Önbellek ile ilgili yönlendirmeler Route::any('/memcached', [CacheController::class, 'memcached']); Route::any('/redis', [CacheController::class, 'redis']); // Veri tabanı ile ilgili yönlendirmeler 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 ek yönlendirmeler ekleyebilirsiniz...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21Kontrolör Dosyaları Oluşturma
app/controller
klasöründeIndexController.php
,CacheController.php
veDatabaseController.php
dosyalarını oluşturun ve aşağıdaki kodları ekleyin.app/controller/IndexController.php
: Ana rota isteklerini yönetmek için.php<?php namespace app\controller; use support\Request; use support\Response; // Response sınıfı ekleniyor class IndexController { /** * Ana yol isteğini yönetecek örnek metod * @param Request $request Gelen istek nesnesi * @return Response Bir Response nesnesi döner */ public function index(Request $request): Response // Dönen değer tipi net { // Basit bir metin yanıtı döndürür return response('Hello ServBay & Webman!'); // Karşılama mesajı güncellendi } }
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östermek için.php<?php namespace app\controller; use support\Request; use support\Response; use Memcached; // Memcached sınıfı ekleniyor use support\Redis; // Webman'dan Redis Facade ekleniyor class CacheController { /** * Memcached kullanımı örneği * @param Request $request * @return Response */ public function memcached(Request $request): Response { // Memcached sunucusuna bağlanıyor, ServBay varsayılan olarak 127.0.0.1:11211 $memcached = new Memcached(); $memcached->addServer('127.0.0.1', 11211); // 60 saniyelik geçerlilikle bir anahtar atıyor $success = $memcached->set('servbay_key', 'Hello Memcached from ServBay!', 60); // Anahtar ve değer güncellendi if (!$success) { return response('Failed to set Memcached key', 500); } // Anahtarı okuyor $value = $memcached->get('servbay_key'); // Anahtar güncellendi // Sonucu döndür return response($value ?: 'Memcached anahtarı bulunamadı veya süresi doldu'); // Bulunamadığında mesaj eklendi } /** * Redis kullanımı örneği * @param Request $request * @return Response */ public function redis(Request $request): Response { // Webman Redis Facade ile anahtar yazılıyor Redis::set('servbay_redis_key', 'Hello Redis from ServBay!'); // Anahtar ve değer güncellendi // Anahtar okunuyor $value = Redis::get('servbay_redis_key'); // Anahtar güncellendi // Sonucu döndür return response($value ?: 'Redis anahtarı bulunamadı'); // Bulunamadığında mesaj eklendi } }
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 üzerinde temel işlemler yapmak için.php<?php namespace app\controller; use support\Request; use support\Response; use support\Db; // Webman'ın Db Facade'ı ekleniyor class DatabaseController { /** * MySQL'e kullanıcı ekleme * @param Request $request * @return Response */ public function mysqlAdd(Request $request): Response { try { // Db Facade ile 'mysql' bağlantısına veri ekleniyor Db::connection('mysql')->table('users')->insert([ 'name' => 'ServBay Webman MySQL User', // Örnek veri güncellendi 'email' => '[email protected]', // E-posta güncellendi 'created_at' => date('Y-m-d H:i:s') // Oluşturulma zamanı eklendi ]); return response('User added to MySQL'); // Yanıt güncellendi } catch (\Exception $e) { return response('MySQL\'e kullanıcı eklenirken hata: ' . $e->getMessage(), 500); // Hata mesajı eklendi } } /** * MySQL'den kullanıcıları listeleme * @param Request $request * @return Response */ public function mysqlGet(Request $request): Response { try { // MySQL'den tüm kullanıcılar çekiliyor $users = Db::connection('mysql')->table('users')->get(); // JSON formatında kullanıcı listesi dönülüyor return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Content-Type net } catch (\Exception $e) { return response('MySQL\'den kullanıcı alınırken hata: ' . $e->getMessage(), 500); // Hata mesajı eklendi } } /** * PostgreSQL'e kullanıcı ekleme * @param Request $request * @return Response */ public function pgsqlAdd(Request $request): Response { try { // PostgreSQL'e veri ekleme Db::connection('pgsql')->table('users')->insert([ 'name' => 'ServBay Webman PgSQL User', // Örnek veri güncellendi 'email' => '[email protected]', // E-posta güncellendi 'created_at' => date('Y-m-d H:i:s') // Oluşturulma zamanı eklendi ]); return response('User added to PostgreSQL'); // Yanıt güncellendi } catch (\Exception $e) { return response('PostgreSQL\'e kullanıcı eklenirken hata: ' . $e->getMessage(), 500); // Hata mesajı eklendi } } /** * PostgreSQL'den kullanıcıları listeleme * @param Request $request * @return Response */ public function pgsqlGet(Request $request): Response { try { // PostgreSQL'den tüm kullanıcılar çekiliyor $users = Db::connection('pgsql')->table('users')->get(); // JSON formatında kullanıcı listesi dönülüyor return response(json_encode($users), 200, ['Content-Type' => 'application/json']); // Content-Type net } catch (\Exception $e) { return response('PostgreSQL\'den kullanıcı alınırken hata: ' . $e->getMessage(), 500); // Hata mesajı eklendi } } }
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ılarını Yapılandırma
Proje ana dizinindeki
config/database.php
dosyasını açın ve MySQL, PostgreSQL bağlantı ayarlarını belirtin. ServBay'in varsayılan DB adresi127.0.0.1
, portları sırası ile3306
(MySQL) ve5432
(PostgreSQL); kullanıcı adıroot
, şifresipassword
'dur.php<?php /** * Veritabanı yapılandırması */ return [ // Varsayılan veritabanı bağlantısı 'default' => 'mysql', // Bağlantı yapılandırmaları 'connections' => [ 'mysql' => [ 'driver' => 'mysql', // ServBay'den varsayılan MySQL sunucu ve portu 'host' => '127.0.0.1', 'port' => 3306, // Daha önce oluşturulan veritabanı 'database' => 'webman_app', // ServBay'in varsayılan MySQL kullanıcısı 'username' => 'root', // Varsayılan şifre 'password' => 'password', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 'pgsql' => [ 'driver' => 'pgsql', // ServBay'in varsayılan PostgreSQL sunucu ve portu 'host' => '127.0.0.1', 'port' => 5432, // Önceden oluşturulan veritabanı 'database' => 'webman_app', // ServBay'in varsayılan PostgreSQL kullanıcısı 'username' => 'root', // Varsayılan şifre 'password' => 'password', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', // veya require, verify-ca, verify-full ], // Ek veritabanı bağlantılarını buraya 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: Canlı prodüksiyon ortamında varsayılan veritabanı şifrelerinizi mutlaka değiştirin ve hassas bilgileri kodda açık bırakmayın.
Webman Projesini Çalıştırma
Webman projeleri genellikle kendi start.php
betiğiyle Workerman sürecini başlatır. Bu, geleneksel Nginx/Apache + PHP-FPM kullanımından farklı olarak, sürekli çalışan asenkron bir uygulamadır.
Proje ana klasöründe (/Applications/ServBay/www/servbay-webman-app
) aşağıdaki komutu çalıştırarak Webman'ı başlatabilirsiniz:
bash
php start.php start
1
Komut çalıştıktan sonra, Webman'ın başlatıldığına dair mesajları göreceksiniz ve varsayılan olarak HTTP isteklerini 127.0.0.1:8787
adresinden dinleyecektir.
- Not: Buradaki
php
komutu, ServBay ortamındaki PHP yürütülebilir dosyasıdır. ServBay terminal ortamını kendisi ayarlar; siz doğrudan ServBay PHP'sini kullanabilirsiniz. - Webman'ı arka planda başlatmak için
-d
ekleyin:php start.php start -d
. - Webman hizmetini durdurmak için:
php start.php stop
- Webman hizmetini yeniden başlatmak için:
php start.php restart
- Kesintisiz (mevcut istekleri bozmadan) yeniden başlatmak için:
php start.php reload
Projeyi Test Etme
Webman başarıyla başlatılıp 127.0.0.1:8787
üzerinde dinlemeye geçtiğinde, aşağıdaki adresleri tarayıcınızda açarak işlevleri test edebilirsiniz:
http://localhost:8787/
: Sayfa çıktısı olarakHello ServBay & Webman!
göreceksiniz.http://localhost:8787/memcached
:Hello Memcached from ServBay!
görüntülenir. Bu, Webman üzerinden ServBay'in Memcached’ine başarılı bir bağlantı anlamına gelir.http://localhost:8787/redis
:Hello Redis from ServBay!
görüntülenir. Bu, Webman üzerinden ServBay’in Redis hizmetine başarıyla ulaşıldığı anlamına gelir.http://localhost:8787/mysql-add
:User added to MySQL
görüntülenir ve bu işlemle MySQL’dekiusers
tablosuna bir kayıt eklenmiş olur.http://localhost:8787/mysql
: Kullanıcı listesini JSON formatında döndürür, kayıtlara göz atabilirsiniz.http://localhost:8787/pgsql-add
:User added to PostgreSQL
mesajı gelir ve PostgreSQL'dekiusers
tablosuna bir kayıt eklenir.http://localhost:8787/pgsql
: PostgreSQL’deki kullanıcı listesini JSON formatında görürsünüz.
Bu adresleri ziyaret ederken sorun yaşarsanız, Webman'ın terminal çıktısında hata olup olmadığına bakın; ayrıca ServBay’de MySQL, PostgreSQL, Redis ve Memcached servislerinin çalıştığından ve PHP uzantılarının etkin olduğundan emin olun.
Sık Sorulan Sorular (SSS)
- S:
php start.php start
komutu bulunamıyor mu?- C: Terminalde mutlaka
servbay-webman-app
klasörünün içinde olmalısınız. Ayrıca ServBay’in kurduğu PHP’nin sistem PATH'ine ekli olduğundan (genellikle ServBay bunu otomatik ayarlar) emin olun.
- C: Terminalde mutlaka
- S:
localhost:8787
erişilemiyor veya bağlantı hatası mı veriyor?- C:
php start.php start
komutunun terminal çıktısında hata olup olmadığını kontrol edin. 8787 portunu başka bir uygulama kullanıyor olabilir; gerekirseconfig/server.php
dosyasından portu değiştirin.
- C:
- S: Veritabanına bağlanılamıyor mu?
- C: MySQL ve PostgreSQL servislerinin ServBay'de çalışır olduğundan emin olun.
config/database.php
dosyasındaki ayarların (sunucu adresi, port, kullanıcı adı, şifre) ServBay’le uyumlu olduğuna emin olun.webman_app
veritabanı veusers
tablosunun oluşturulmuş olması lazım.
- C: MySQL ve PostgreSQL servislerinin ServBay'de çalışır olduğundan emin olun.
- S: Memcached veya Redis bağlantı sorunu mu var?
- C: ServBay’de ilgili servislerin çalıştığından emin olun.
app/controller/CacheController.php
dosyasındaki bağlantı adresi ve port bilgisinin (varsayılan:127.0.0.1:11211
ve127.0.0.1:6379
) doğruluğunu kontrol edin. PHP sürümünde ilgili uzantıların etkinleştirildiğinden emin olun.
- C: ServBay’de ilgili servislerin çalıştığından emin olun.
Özet
Bu adımlar sayesinde, ServBay yerel geliştirme ortamında temel bir Webman projesi oluşturup yapılandırmayı ve çalıştırmayı başardınız. ServBay’in sunduğu tek noktadan yönetim avantajı ile hızlıca Webman geliştirme ortamınızı kurdunuz ve veritabanı ile önbellek fonksiyonlarını başarıyla entegre ettiniz. Webman’ın yüksek performans potansiyeli ile ServBay’in pratikliği birleşerek sizin asenkron PHP uygulama geliştirme sürecinize büyük güç katacaktır. Bu rehberin, ServBay ve Webman ile mükemmel Web uygulamaları oluşturmanıza yardımcı olacağını umarız.