Laravel geliştirme
Laravel uygulamaları: geliştirilir ve çalışır durumda tutulur.
İlk modelden kuyruk worker'larına, dağıtımlardan yıllar sonraki yükseltmeye kadar – tek bir ekip tarafından yazılır, barındırılır ve bakımı yapılır.
Sunucuda bir sürüm böyle görünür
Çalıştırdığımız her Laravel uygulaması aynı şekilde yayına çıkar: test edilir, derlenir, önbelleğe alınır ve bir saniyelik kesinti olmadan devreye alınır.
01ci ~/app $ php artisan test PASS Tests\Feature\CheckoutTest ✓ a paid order queues the invoice ✓ a declined card never marks the order paid PASS Tests\Unit\VatTest ✓ vat is added once, on the total 02app ~/releases/1400 $ composer install --no-dev --optimize-autoloaderInstalling dependencies from lock fileGenerating optimized autoload files 03app ~/releases/1400 $ php artisan migrate --force INFO Running migrations. 2026_09_27_090000_add_due_date_to_invoices ....... DONE 04app ~/releases/1400 $ php artisan optimize INFO Caching framework bootstrap, configuration, and metadata. config ...................................... DONE events ...................................... DONE routes ...................................... DONE views ....................................... DONE 05app ~/releases/1400 $ ln -sfn ~/releases/1400 ~/current06app ~/releases/1400 $ php artisan horizon:terminate && php artisan octane:reload 07app ~/releases/1400 $ sudo supervisorctl statushorizon RUNNING pid 48211, uptime 0:00:09octane RUNNING pid 31877, uptime 6 days, 2:14:51 08app ~/releases/1400 $ php artisan schedule:list */5 * * * * php artisan horizon:snapshot ... Next Due: 3 minutes from now 0 2 * * * php artisan model:prune ........ Next Due: 9 hours from now 0 9 * * * php artisan invoices:remind .... Next Due: 16 hours from now
Önce testler
Sunucuya hiçbir şey ulaşmadan önce testler çalışır. Tek bir başarısız test sürümü durdurur.
Bağımlılıklar
Yalnızca kilit dosyasından, geliştirme paketleri olmadan ve optimize edilmiş bir otomatik yükleyiciyle kurulur.
Migration'lar
Sürüm geçişi sürerken çalışan kod yeni şemayla da çalışmaya devam edecek şekilde yazılır.
Önbellekler
Yapılandırma, olaylar, rotalar ve görünümler önbelleğe alınır. Bu noktadan sonra ortam dosyası hiç okunmaz; env() bu yüzden yalnızca yapılandırma dosyalarında kullanılır.
Geçiş
Tek bir bağlantı yer değiştirir ve yeni sürüm yayına girer. Önceki sürüm geri dönüş için diskte kalır.
Worker'lar
Horizon elindeki işleri bitirir ve yeni kodla yeniden başlar; Octane da worker'larını aynı şekilde yeniden yükler.
Denetim altında
Supervisor, Horizon ve Octane'i çalışır durumda tutar; ikisinden biri durursa yeniden başlatır.
Zamanlayıcı
Tek bir cron satırı tüm zamanlanmış görevleri çalıştırır. Sıradaki çalıştıracakları bunlar.
Tek tıklamadan tamamlanmış işe
Yavaş iş, isteğin dışına çıkar. Müşteri hemen yanıt alır, geri kalanını arka planda bir worker yapar.
-
01 · İstek
POST /checkoutMüşteri ödeme yapar
Controller siparişi doğrular, kaydeder ve hemen yanıt verir. Burada yavaş hiçbir şey olmaz.
-
02 · İş
PayOrder::dispatch()Yavaş kısım ayrı bir işe dönüşür
Veritabanı işlemi tamamlandıktan sonra kuyruğa gönderilir; böylece bir worker geri alınmış bir siparişi asla almaz.
-
03 · Kuyruk
redis · paymentsKendi kuyruğunda bekler
Ödemelerin kendi kuyruğu vardır; böylece uzun bir dışa aktarım hiçbir ödemeyi bekletmez.
-
04 · Worker
horizon · supervisorBir worker işi alır
Zaman aşımıyla, her seferinde daha uzun bekleyen yeniden denemelerle ve aynı anda kaç tanesinin çalışacağına dair bir sınırla.
-
05 · Bildirim
OrderPaid → mail, databaseHerkes haberdar edilir
Müşteri faturayı e-postayla alır, sipariş de panelinizde ödendi olarak görünür.
failed_jobs
Yeniden deneme hakkı biten bir iş, hatasıyla birlikte saklanır ve bize uyarı gelir. Neden giderildiğinde yeniden denenir – asla sessizce kaybolmaz.
Yalnızca sunucu değil, uygulamanın tamamı
Ekibimiz her Laravel projesine, ilk modelden yıllar sonraki yükseltmeye kadar yirmi beş yıllık PHP deneyimini getirir.
Geliştirme
Uygulamanın kendisi.
- Mimari
- İş mantığı controller'larda değil, action ve servis sınıflarında. Doğrulama için form request'ler, kimin neyi yapabileceği için policy'ler.
- Eloquent
- Bir sayfanın listelediği ilişkiler baştan yüklenir; böylece bir sayfa yüzlerce değil, birkaç sorguya mal olur. Geliştirme ortamında lazy loading hata verir, böylece sorun erkenden yakalanır.
- Livewire · Inertia
- Ekip PHP ve Blade yazıyorsa Livewire; ön yüz ayrı bir projeyse Vue ya da React ile Inertia.
- Sanctum ile API'ler
- Mobil uygulamalar ve iş ortakları için token'lar, kendi ön yüzünüz için çerez oturumları ve istemci başına istek sınırları.
- Pest · PHPUnit
- Para alan veya e-posta gönderen her yol için testler; her push'ta, sürüm oluşturulmadan önce çalıştırılır.
İşletme
Yanıt vermeye devam etmesini sağlayanlar.
- Kuyruklar ve Horizon
- Acil ve toplu işler için ayrı kuyruklar; her birinin kendi worker'ları, zaman aşımları ve yeniden denemeleri vardır ve hepsi Horizon panelinden izlenir.
- Zamanlayıcı
- Tek bir cron satırı tüm görevleri çalıştırır. Çakışmaması veya yalnızca tek bir sunucuda çalışması gereken görevler buna göre işaretlenir.
- Octane
- Swoole, RoadRunner veya FrankenPHP uygulamayı istekler arasında bellekte tutar. Bunu açmadan önce kodu, bir istekten diğerine sızan durumlara karşı kontrol ederiz.
- Redis
- Önbellek, oturumlar, kuyruklar ve kilitler; internetten erişilemeyen bir Redis üzerinde.
- Supervisor
- Kuyruk worker'ları, Horizon ve Octane denetlenen süreçler olarak çalışır; durduklarında ve her sürümden sonra yeniden başlatılır.
Bakım
Güncel kalmasını sağlayanlar.
- Kesintisiz dağıtımlar
- Her sürüm kendi dizininde oluşturulur ve tek bir bağlantıyla devreye alınır. Geri dönmek, aynı adımın tersidir.
- Loglar ve istisnalar
- Belirli bir süre saklanan günlük log dosyaları; her istisna da ona yol açan istekle birlikte bize bildirilir.
- Yükseltmeler
- Laravel her yıl yeni bir ana sürüm çıkarır. Bir uygulamayı her adımda testler geçerek, her seferinde bir sürüm ilerletiriz.
İlk gün kurduklarımız
İlk müşteri gelmeden önce, çalıştırdığımız her Laravel sunucusunda bunların hepsi hazırdır.
- Üretimde hata ayıklama modu kapalı ve web'e yalnızca public dizini sunuluyor
APP_DEBUG=false - Kuyruk worker'ları Supervisor altında, her sürümde yeniden başlatılır
supervisord - Zamanlayıcı için tek bir cron satırı
* * * * * php artisan schedule:run - Önbellek, oturumlar ve kuyruklar için Redis
CACHE_STORE=redis - Yapılandırma, olaylar, rotalar ve görünümler her sürümde önbelleğe alınır
php artisan optimize - OPcache açık ve her sürümde sıfırlanır
opcache.validate_timestamps=0 - Sunucunun belleğine göre boyutlandırılmış bir PHP-FPM havuzu
pm.max_children - Kendi dizinlerinde sürümler, geri dönüşe tek adım uzaklıkta
current → releases/… - Başarısız işler bir tabloda bırakılmaz, bize bildirilir
failed_jobs - Log rotasyonu ve istisna uyarıları
LOG_CHANNEL=daily - Sunucu dışına kopyalanan gecelik veritabanı yedeği
backup · offsite - Kendini yenileyen bir TLS sertifikası
Let's Encrypt
Diskte bir sürüm
/var/www/example-app
├── current → releases/1400
├── releases/
│ ├── 1400
│ └── 0930
└── shared/
├── .env
└── storage/

Bize uygulamanızdan bahsedin
Yeni bir geliştirme, barındırılacak yer arayan bir uygulama ya da eski bir sürümde takılıp kalmış bir uygulama. Her proje kısa bir görüşmeden sonra fiyatlandırılır.