Laravel harika bir framework’tür; ancak projenizi, PHP, Composer, bir web sunucusu veya “veritabanı” kavramından haberi olmayan birine “göndermek” zorunda kaldığınızda işler karmaşıklaşır. Bu nedenle WinRavel isimli bir araç geliştirdim: Laravel projenizi seçiyorsunuz, Build’e tıklıyorsunuz ve sadece çalışan bir .exe alıyorsunuz.
PHP kurulumu yok. XAMPP yok. composer install yok. Çift tıklama ile → bir siyah kontrol penceresi açılıyor → uygulamanız 127.0.0.1 adresinde çalışıyor.
Exe İçeriği
Exe İçeriği
- FrankenPHP (PHP 8.5 + Caddy) — gömülü uygulama sunucusu
- Laravel uygulamanız — tam olarak oluşturma aşamasında ayarlanmış (
composer install,key:generate,migrate, isteğe bağlıdb:seed) - SQLite (varsayılan) veya gerçek MySQL için paketlenmiş MariaDB sunucusu
- İsteğe bağlı kaynak obfuscation
app/
İlk çalıştırmada %APPDATA%\ dizinine çıkarılır, ardından frankenphp php-server bu dizini sunar. Bir Windows Job Object, PHP (ve MariaDB) sürecini başlatıcıya bağlı tutar, böylece hiçbir şey terk edilmez.
İlginç Mühendislik Noktaları
İlginç Mühendislik Noktaları
1. Her derlemede yeniden derleme yok (kendinden çıkaran).
Başlatıcı, FrankenPHP’nin runtime’ını gömülmüş olarak içeren önceden derlenmiş bir C# stub’ıdır. Bir uygulama oluşturmak sadece payload eklemekten ibarettir — [app.zip][config][footer]. Başlatıldığında, stub kendi .exe’sinin sonundaki baytları okur. Sonuç: derlemeler anındır ve derleme makinesinin .NET SDK’sına ihtiyacı yoktur.
2. 250MB olmadan MariaDB paketleme.
MySQL/Postgres, PHP için gerçek bir gömülü moda sahip değildir (ve PGlite WASM/JS’dir — PHP’nin pdo kullanımı için işe yaramaz). “Gerçek MySQL” için, sadece kesilmiş MariaDB paketliyorum: sadece mariadbd + birkaç DLL + bir önceden başlatılmış şablon veri dizini. Oluşturma aşamasında WinRavel, MariaDB’yi başlatır, veritabanını oluşturur, göçleri çalıştırır, kapatır ve göçtürülen veri dizinini gönderir. Başlatıcı bunu otomatik olarak başlatır/durdurur. InnoDB’nin yeniden günlüğünün küçültülmesi (96MB → 8MB) onu hafif tutar.
3. Hala çalışan PHP’yi obfuscate etme.
Her app/*.php dosyası olarak kodlanır. Namespace ve sınıf isimleri intakt kalır (bunlar eval'de yer alır), böylece Laravel'in reflection/autoload mekanizması çalışmaya devam eder. Dürüst bir uyarı: saf-PHP obfuscation bir caydırmadır, DRM değildir.
4. SQLite ≠ MySQL.
"Force SQLite" seçeneği, bir MySQL .env dosyasını SQLite olarak yeniden yazar - kullanışlıdır, ancak MySQL'e özgü SQL'de başarısız olur. İşte bu yüzden MariaDB paketi vardır.
Teknoloji Yığını
Teknoloji Yığını
C# / .NET 10 (WinForms oluşturucu + başlatıcı) · FrankenPHP · Caddy · MariaDB · Inno Setup.
Deneyin
Deneyin
👉 github.com/fdciabdul/WinRavel — Releases'tan WinRavel-Setup.exe'yi indirin.
Kaynak: Orijinal Makale




