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.

ci ~/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 app ~/releases/1400 $ composer install --no-dev --optimize-autoloaderInstalling dependencies from lock fileGenerating optimized autoload files app ~/releases/1400 $ php artisan migrate --force   INFO  Running migrations.  2026_09_27_090000_add_due_date_to_invoices ....... DONE app ~/releases/1400 $ php artisan optimize   INFO  Caching framework bootstrap, configuration, and metadata.  config ...................................... DONE  events ...................................... DONE  routes ...................................... DONE  views ....................................... DONE app ~/releases/1400 $ ln -sfn ~/releases/1400 ~/currentapp ~/releases/1400 $ php artisan horizon:terminate && php artisan octane:reload app ~/releases/1400 $ sudo supervisorctl statushorizon                 RUNNING   pid 48211, uptime 0:00:09octane                  RUNNING   pid 31877, uptime 6 days, 2:14:51 app ~/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
Örnek bir uygulama üzerinde örnek bir oturum. Adlar, yollar ve çıktılar temsilidir.
  1. Önce testler

    Sunucuya hiçbir şey ulaşmadan önce testler çalışır. Tek bir başarısız test sürümü durdurur.

  2. Bağımlılıklar

    Yalnızca kilit dosyasından, geliştirme paketleri olmadan ve optimize edilmiş bir otomatik yükleyiciyle kurulur.

  3. Migration'lar

    Sürüm geçişi sürerken çalışan kod yeni şemayla da çalışmaya devam edecek şekilde yazılır.

  4. Ö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.

  5. 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.

  6. Worker'lar

    Horizon elindeki işleri bitirir ve yeni kodla yeniden başlar; Octane da worker'larını aynı şekilde yeniden yükler.

  7. Denetim altında

    Supervisor, Horizon ve Octane'i çalışır durumda tutar; ikisinden biri durursa yeniden başlatır.

  8. 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.

  1. 01 · İstek POST /checkout

    Müşteri ödeme yapar

    Controller siparişi doğrular, kaydeder ve hemen yanıt verir. Burada yavaş hiçbir şey olmaz.

  2. 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.

  3. 03 · Kuyruk redis · payments

    Kendi kuyruğunda bekler

    Ödemelerin kendi kuyruğu vardır; böylece uzun bir dışa aktarım hiçbir ödemeyi bekletmez.

  4. 04 · Worker horizon · supervisor

    Bir 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.

  5. 05 · Bildirim OrderPaid → mail, database

    Herkes haberdar edilir

    Müşteri faturayı e-postayla alır, sipariş de panelinizde ödendi olarak görünür.

Başarısız olmaya devam ederse 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 sunuluyorAPP_DEBUG=false
  • Kuyruk worker'ları Supervisor altında, her sürümde yeniden başlatılırsupervisord
  • Zamanlayıcı için tek bir cron satırı* * * * * php artisan schedule:run
  • Önbellek, oturumlar ve kuyruklar için RedisCACHE_STORE=redis
  • Yapılandırma, olaylar, rotalar ve görünümler her sürümde önbelleğe alınırphp artisan optimize
  • OPcache açık ve her sürümde sıfırlanıropcache.validate_timestamps=0
  • Sunucunun belleğine göre boyutlandırılmış bir PHP-FPM havuzupm.max_children
  • Kendi dizinlerinde sürümler, geri dönüşe tek adım uzaklıktacurrent → releases/…
  • Başarısız işler bir tabloda bırakılmaz, bize bildirilirfailed_jobs
  • Log rotasyonu ve istisna uyarılarıLOG_CHANNEL=daily
  • Sunucu dışına kopyalanan gecelik veritabanı yedeğibackup · 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/
Web sunucusu current dizinini gösterir. Bağlantı yer değiştirdiği anda sürüm yayındadır; bir öncekisi geri dönüş için kalır.

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.