{"id":1402,"date":"2025-11-06T14:24:20","date_gmt":"2025-11-06T11:24:20","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/laravel-prod-ortam-optimizasyonu-nasil-yapilir-php%e2%80%91fpm-opcache-octane-queue-horizon-ve-redisi-el-ele-calistirmak\/"},"modified":"2025-11-06T14:24:20","modified_gmt":"2025-11-06T11:24:20","slug":"laravel-prod-ortam-optimizasyonu-nasil-yapilir-php%e2%80%91fpm-opcache-octane-queue-horizon-ve-redisi-el-ele-calistirmak","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/laravel-prod-ortam-optimizasyonu-nasil-yapilir-php%e2%80%91fpm-opcache-octane-queue-horizon-ve-redisi-el-ele-calistirmak\/","title":{"rendered":"Laravel Prod Ortam Optimizasyonu Nas\u0131l Yap\u0131l\u0131r? PHP\u2011FPM, OPcache, Octane, Queue\/Horizon ve Redis\u2019i El Ele \u00c7al\u0131\u015ft\u0131rmak"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Bir_Gece_Yarisi_Gelen_502ler_ve_Dugum_Dugum_Prod_Ayarlari\"><span class=\"toc_number toc_depth_1\">1<\/span> Bir Gece Yar\u0131s\u0131 Gelen 502\u2019ler ve D\u00fc\u011f\u00fcm D\u00fc\u011f\u00fcm Prod Ayarlar\u0131<\/a><\/li><li><a href=\"#PHPFPM_Havuzlari_Yan_Yana_Calisan_Isciler_Nasil_Nefes_Alir\"><span class=\"toc_number toc_depth_1\">2<\/span> PHP\u2011FPM Havuzlar\u0131: Yan Yana \u00c7al\u0131\u015fan \u0130\u015f\u00e7iler Nas\u0131l Nefes Al\u0131r?<\/a><ul><li><a href=\"#Ilk_Temas_Zaman_Asimi_ve_Kuyruk_Etkisi\"><span class=\"toc_number toc_depth_2\">2.1<\/span> \u0130lk Temas: Zaman A\u015f\u0131m\u0131 ve Kuyruk Etkisi<\/a><\/li><li><a href=\"#Loglar_yavaslar_ve_gorunurluk\"><span class=\"toc_number toc_depth_2\">2.2<\/span> Loglar, yava\u015flar ve g\u00f6r\u00fcn\u00fcrl\u00fck<\/a><\/li><\/ul><\/li><li><a href=\"#OPcache_Hafizanin_Icinde_Sicak_Tutan_Battaniye\"><span class=\"toc_number toc_depth_1\">3<\/span> OPcache: Haf\u0131zan\u0131n \u0130\u00e7inde S\u0131cak Tutan Battaniye<\/a><ul><li><a href=\"#Deploy_Anlarinda_OPcachei_Urkutmeden_Yenilemek\"><span class=\"toc_number toc_depth_2\">3.1<\/span> Deploy Anlar\u0131nda OPcache\u2019i \u00dcrk\u00fctmeden Yenilemek<\/a><\/li><\/ul><\/li><li><a href=\"#Octane_Oyun_Degistirici_Hiz_mi_Dikkatli_Kullanilmasi_Gereken_Guc_mu\"><span class=\"toc_number toc_depth_1\">4<\/span> Octane: Oyun De\u011fi\u015ftirici H\u0131z m\u0131, Dikkatli Kullan\u0131lmas\u0131 Gereken G\u00fc\u00e7 m\u00fc?<\/a><ul><li><a href=\"#Octane_ile_Queue_ve_Cachein_Dili_Ayni_Olmali\"><span class=\"toc_number toc_depth_2\">4.1<\/span> Octane ile Queue ve Cache\u2019in Dili Ayn\u0131 Olmal\u0131<\/a><\/li><\/ul><\/li><li><a href=\"#QueueHorizon_Web_Isteginden_Ayrilan_Uzun_Islerin_Mutlu_Dunyasi\"><span class=\"toc_number toc_depth_1\">5<\/span> Queue\/Horizon: Web \u0130ste\u011finden Ayr\u0131lan Uzun \u0130\u015flerin Mutlu D\u00fcnyas\u0131<\/a><ul><li><a href=\"#Failed_Jobs_Gunlukler_ve_Sagduyu\"><span class=\"toc_number toc_depth_2\">5.1<\/span> Failed Jobs, G\u00fcnl\u00fckler ve Sa\u011fduyu<\/a><\/li><\/ul><\/li><li><a href=\"#Redis_Ayarlari_Hafizanin_Hizli_Kurallarin_Net_Oldugu_Yer\"><span class=\"toc_number toc_depth_1\">6<\/span> Redis Ayarlar\u0131: Haf\u0131zan\u0131n H\u0131zl\u0131, Kurallar\u0131n Net Oldu\u011fu Yer<\/a><ul><li><a href=\"#Key_Adlandirma_TTL_ve_Izleme\"><span class=\"toc_number toc_depth_2\">6.1<\/span> Key Adland\u0131rma, TTL ve \u0130zleme<\/a><\/li><\/ul><\/li><li><a href=\"#Dagitim_Ritueli_Koddan_Konfige_Konfigden_Gozleme\"><span class=\"toc_number toc_depth_1\">7<\/span> Da\u011f\u0131t\u0131m Rit\u00fceli: Koddan Konfige, Konfigden G\u00f6zleme<\/a><\/li><li><a href=\"#Gercek_Bir_Akis_Kaynak_Planlama_Havuz_Cache_ve_Kuyruk_El_Sikisiyor\"><span class=\"toc_number toc_depth_1\">8<\/span> Ger\u00e7ek Bir Ak\u0131\u015f: Kaynak Planlama, Havuz, Cache ve Kuyruk El S\u0131k\u0131\u015f\u0131yor<\/a><\/li><li><a href=\"#Kapanis_Vidalari_Sik_Sahneden_Yavasca_Cekil\"><span class=\"toc_number toc_depth_1\">9<\/span> Kapan\u0131\u015f: Vidalar\u0131 S\u0131k, Sahneden Yava\u015f\u00e7a \u00c7ekil<\/a><\/li><li><a href=\"#Bonus_Kucuk_Komut_Ajandasi\"><span class=\"toc_number toc_depth_1\">10<\/span> Bonus: K\u00fc\u00e7\u00fck Komut Ajandas\u0131<\/a><\/li><li><a href=\"#Kaynak_Notlari\"><span class=\"toc_number toc_depth_1\">11<\/span> Kaynak Notlar\u0131<\/a><\/li><\/ul><\/div>\n<h2 id=\"section-1\"><span id=\"Bir_Gece_Yarisi_Gelen_502ler_ve_Dugum_Dugum_Prod_Ayarlari\">Bir Gece Yar\u0131s\u0131 Gelen 502\u2019ler ve D\u00fc\u011f\u00fcm D\u00fc\u011f\u00fcm Prod Ayarlar\u0131<\/span><\/h2>\n<p>Hi\u00e7 ba\u015f\u0131na geldi mi? Trafik sakin sakin akarken bir kampanya butonu \u201cyay\u0131nla\u201d diye parlad\u0131\u011f\u0131nda, grafik bir anda dik bir da\u011fa d\u00f6n\u00fc\u015f\u00fcr. Benim ba\u015f\u0131ma geldi. Gece yar\u0131s\u0131, telefon elimde, ekibin chat\u2019inde \u201c502 var\u201d mesajlar\u0131 ak\u0131yor. Sunucu g\u00fc\u00e7l\u00fc, kod fena de\u011fil, ama bir yerler sanki birbirine k\u00fcs. O an anlad\u0131m: Prod ortam\u0131 sadece g\u00fc\u00e7l\u00fc donan\u0131mla de\u011fil, birbirini tamamlayan ayarlarla ayakta kal\u0131yor. \u0130\u015fte bug\u00fcn bu d\u00fc\u011f\u00fcm\u00fc, ad\u0131m ad\u0131m, sahiden ya\u015fad\u0131\u011f\u0131m k\u00fc\u00e7\u00fck sars\u0131nt\u0131larla anlatarak \u00e7\u00f6zmek istiyorum.<\/p>\n<p>Laravel\u2019de performans dedi\u011fimiz \u015fey tek bir d\u00fc\u011fmeye bas\u0131nca a\u00e7\u0131lan gizli bir mod de\u011fil. PHP\u2011FPM havuzlar\u0131 do\u011fru ayarlanmam\u0131\u015fsa OPcache\u2019in hakk\u0131n\u0131 veremiyorsun. Octane\u2019i kurup b\u0131rakt\u0131\u011f\u0131nda, payla\u015f\u0131lan durumlar seni terletiyor. Queue\/Horizon g\u00fcc\u00fcn\u00fc sahaya s\u00fcremezsen web istekleri kuyru\u011fa tak\u0131l\u0131yor, Redis ayarlar\u0131 dikkat edilmezse en kritik anda cache \u00e7\u00f6z\u00fcmleri aya\u011f\u0131na dolan\u0131yor. Bu yaz\u0131da tam olarak bunlar\u0131 konu\u015faca\u011f\u0131z: PHP\u2011FPM havuzlar\u0131ndan ba\u015flay\u0131p OPcache\u2019e uzanaca\u011f\u0131z, oradan Octane\u2019in h\u0131z hissine g\u00f6z k\u0131rp\u0131p Queue\/Horizon ve Redis\u2019in kulisteki marifetlerini birlikte toplayaca\u011f\u0131z. Hadi, yava\u015f\u00e7a vidalar\u0131 s\u0131kal\u0131m.<\/p>\n<h2 id=\"section-2\"><span id=\"PHPFPM_Havuzlari_Yan_Yana_Calisan_Isciler_Nasil_Nefes_Alir\">PHP\u2011FPM Havuzlar\u0131: Yan Yana \u00c7al\u0131\u015fan \u0130\u015f\u00e7iler Nas\u0131l Nefes Al\u0131r?<\/span><\/h2>\n<p>Mesela \u015f\u00f6yle d\u00fc\u015f\u00fcn\u00fcn: Bir pizzac\u0131das\u0131n\u0131z, f\u0131r\u0131n var, hamur haz\u0131r, ama tezg\u00e2h dar. \u015eef say\u0131s\u0131n\u0131 art\u0131r\u0131nca tezg\u00e2h yetmeyebilir, tek \u015fefle b\u0131rak\u0131rsan\u0131z sipari\u015f kuyru\u011fa girer. PHP\u2011FPM havuzlar\u0131 da buna benziyor. \u00c7ok az process a\u00e7arsan\u0131z talepler bekler, \u00e7ok fazla a\u00e7arsan\u0131z RAM \u015fi\u015fer, swap\u2019a d\u00fc\u015fer ve i\u015f tam tersine yava\u015flar. O ilk 502 gecesinde benim hatam buydu. \u201cBiraz daha <strong>pm.max_children<\/strong> verelim\u201d dedim, RAM a\u011flad\u0131, I\/O tak\u0131ld\u0131, gecikmeler b\u00fcy\u00fcd\u00fc.<\/p>\n<p>Buradaki dengeyi bulman\u0131n en pratik yolu, bir PHP\u2011FPM i\u015f\u00e7isinin yakla\u015f\u0131k ne kadar RAM yedi\u011fini anlamak. Uygulaman\u0131z\u0131 ger\u00e7ek trafik alt\u0131nda birka\u00e7 dakika izleyin. Top\u2019ta, htop\u2019ta veya ps ile process ba\u015f\u0131na bellek t\u00fcketimini g\u00f6r\u00fcn. Diyelim ortalama 70\u2013120 MB aras\u0131 gidip geliyor. Sunucuda PHP i\u00e7in ay\u0131rabilece\u011finiz RAM\u2019i kabaca hesaplay\u0131p, g\u00fcvenli bir pay b\u0131rakarak <strong>pm.max_children<\/strong>\u2019\u0131 belirleyin. Bu de\u011feri \u015fi\u015firmektense, <strong>pm<\/strong> modunu <strong>dynamic<\/strong> veya sakin trafiklerde <strong>ondemand<\/strong> yap\u0131p, <strong>pm.start_servers<\/strong>, <strong>pm.min_spare_servers<\/strong> ve <strong>pm.max_spare_servers<\/strong> ile nefes ald\u0131r\u0131n. Statik mod, her an dolu kadro bekletmek gibi; bazen mant\u0131kl\u0131, bazen kaynak israf\u0131.<\/p>\n<h3><span id=\"Ilk_Temas_Zaman_Asimi_ve_Kuyruk_Etkisi\">\u0130lk Temas: Zaman A\u015f\u0131m\u0131 ve Kuyruk Etkisi<\/span><\/h3>\n<p>Web sunucunla PHP\u2011FPM aras\u0131ndaki zaman a\u015f\u0131m\u0131 de\u011ferleri ger\u00e7ek\u00e7i olmal\u0131. Nginx veya Apache taraf\u0131nda upstream timeouts y\u00fckselterek sorunu ertelemek kolay, ama bu sefer kuyru\u011fun i\u00e7i doluyor. As\u0131l mesele, yava\u015f i\u015flerin web iste\u011fi s\u0131ras\u0131nda yap\u0131lmamas\u0131. Rapora PDF g\u00f6mmek, \u00fc\u00e7\u00fcnc\u00fc parti entegrasyondan cevap beklemek gibi i\u015fler <strong>queue<\/strong>\u2019ya kaymal\u0131. FPM\u2019de <strong>request_terminate_timeout<\/strong> gibi ayarlarla korkun\u00e7 uzayan talepleri kesmek, logda ne oldu\u011funu g\u00f6rmek ve kuyruklara aktarmak kritik.<\/p>\n<h3><span id=\"Loglar_yavaslar_ve_gorunurluk\">Loglar, yava\u015flar ve g\u00f6r\u00fcn\u00fcrl\u00fck<\/span><\/h3>\n<p>\u201cNiye yava\u015f?\u201d sorusu gecenin k\u00f6r\u00fcnde en sinir bozucu olan\u0131. <strong>php-fpm slowlog<\/strong> a\u00e7\u0131n, threshold\u2019u makul ayarlay\u0131n. <strong>pm.status_path<\/strong> ile durum sayfas\u0131 ekleyin, anl\u0131k yo\u011funlu\u011fu g\u00f6r\u00fcn. \u0130stekleri yutar gibi yapan gizli \u201cN+1\u201d sorgular\u0131, yanl\u0131\u015f yerde yap\u0131lan dosya i\u015flemlerini, yersiz cache temizlemelerini b\u00f6yle yakalars\u0131n\u0131z. Bu veriler yoksa, optimize etmek sadece tahmin olur.<\/p>\n<h2 id=\"section-3\"><span id=\"OPcache_Hafizanin_Icinde_Sicak_Tutan_Battaniye\">OPcache: Haf\u0131zan\u0131n \u0130\u00e7inde S\u0131cak Tutan Battaniye<\/span><\/h2>\n<p>OPcache, PHP dosyalar\u0131n\u0131 derleyip bellekte tutar. B\u00f6ylece her istekte ayn\u0131 masraf\u0131 tekrar ya\u015famazs\u0131n\u0131z. Ancak OPcache\u2019i sadece a\u00e7mak yetmez; k\u00fc\u00e7\u00fck ayarlarla b\u00fcy\u00fck rahatl\u0131k gelir. Ay\u0131rd\u0131\u011f\u0131n\u0131z bellek dar ise par\u00e7alanma ba\u015flar, \u201cs\u0131\u011fm\u0131yorum\u201d mesajlar\u0131 loglara d\u00fc\u015fer, performans ini\u015fli \u00e7\u0131k\u0131\u015fl\u0131 olur. Bir projede 64\u2013128 MB derken yetmedi\u011fini, kod say\u0131s\u0131 artt\u0131k\u00e7a <strong>opcache.memory_consumption<\/strong> ve <strong>opcache.interned_strings_buffer<\/strong>\u2019\u0131 nazik\u00e7e b\u00fcy\u00fctmem gerekti\u011fini deneyimledim. <a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\" rel=\"nofollow noopener\" target=\"_blank\">OPcache yap\u0131land\u0131rma se\u00e7eneklerini anlatan resm\u00ee dok\u00fcman<\/a> bunu sade bi\u00e7imde \u00f6zetler.<\/p>\n<p>Prod\u2019da <strong>opcache.validate_timestamps=0<\/strong> yapmak tatl\u0131d\u0131r; her deploy\u2019da FPM\u2019i nazik\u00e7e yeniden y\u00fcklemek yeter. Dosya zaman damgas\u0131 izleme trafi\u011fi hafifler. E\u011fer payla\u015f\u0131ml\u0131 nfs gibi garip bir dosya sistemi yoksa, bu ayar y\u00fcksek trafikte bariz nefes ald\u0131r\u0131r. JIT konusuna gelince, PHP 8 ile geldi ama her Laravel projesinde hissedilir bir fark b\u0131rakmayabilir. Mikroservis gibi CPU a\u011f\u0131rl\u0131kl\u0131 hesap yapan \u00f6zg\u00fcn k\u0131s\u0131mlar varsa denersiniz, yoksa bile OPcache tek ba\u015f\u0131na yeterince i\u015f \u00e7\u0131kar\u0131r.<\/p>\n<h3><span id=\"Deploy_Anlarinda_OPcachei_Urkutmeden_Yenilemek\">Deploy Anlar\u0131nda OPcache\u2019i \u00dcrk\u00fctmeden Yenilemek<\/span><\/h3>\n<p>Klasik ak\u0131\u015f: build tamam, env ve cache dosyalar\u0131 g\u00fcncellendi, sonra PHP\u2011FPM\u2019ye <em>reload<\/em>. S\u0131f\u0131rdan a\u00e7mak yerine \u201creload\u201d tercihim, ayakta duran s\u00fcre\u00e7lerin bir anda yok olmamas\u0131n\u0131 sa\u011fl\u0131yor. Y\u00fckseltme s\u0131ras\u0131nda kademeli ge\u00e7i\u015f hissi geliyor. Bir de <strong>opcache.file_cache<\/strong> ile disk tabanl\u0131 cache kullanmay\u0131 deneyenler var; baz\u0131 ortamlarda a\u00e7\u0131l\u0131\u015f s\u00fcresini k\u0131salt\u0131yor, baz\u0131lar\u0131nda disk IO u\u011fultu yap\u0131yor. K\u00fc\u00e7\u00fck bir ortamda deneyip karar vermek en sa\u011fl\u0131kl\u0131s\u0131.<\/p>\n<h2 id=\"section-4\"><span id=\"Octane_Oyun_Degistirici_Hiz_mi_Dikkatli_Kullanilmasi_Gereken_Guc_mu\">Octane: Oyun De\u011fi\u015ftirici H\u0131z m\u0131, Dikkatli Kullan\u0131lmas\u0131 Gereken G\u00fc\u00e7 m\u00fc?<\/span><\/h2>\n<p>Octane\u2019i ilk kurdu\u011fum g\u00fcn, sayfalar sanki aya\u011f\u0131ndan zincir \u00e7\u00f6z\u00fclm\u00fc\u015f gibi a\u00e7\u0131ld\u0131. Fakat i\u015fin b\u00fcy\u00fcs\u00fc \u015fu: Uygulama s\u00fcre\u00e7leri ayakta kald\u0131\u011f\u0131ndan, bir istekten kalan baz\u0131 \u015feyler di\u011ferine s\u0131zabiliyor. Statik de\u011fi\u015fkenler, singleton\u2019lar, servislerin i\u00e7inde biriktirilen durumlar\u2026 Bunlar\u0131 temizlemezsen, \u201chayalet veri\u201d dedi\u011fim tuhaf bug\u2019lar \u00e7\u0131k\u0131yor. O y\u00fczden Octane, disiplin istiyor. <a href=\"https:\/\/laravel.com\/docs\/octane\" rel=\"nofollow noopener\" target=\"_blank\">Octane\u2019in resmi dok\u00fcmanlar\u0131nda<\/a> istekler aras\u0131 durum y\u00f6netimi ve yeniden ba\u015flatmalarla ilgili g\u00fczel ipu\u00e7lar\u0131 var.<\/p>\n<p>Ka\u00e7 worker? Sunucudaki CPU \u00e7ekirdeklerini ve RAM\u2019i d\u00fc\u015f\u00fcnerek ba\u015flamak en g\u00fczeli. \u00d6rne\u011fin 4\u20138 worker ile ba\u015flay\u0131p, <strong>max requests<\/strong> de\u011ferini makul tutmak ve bellek s\u0131z\u0131nt\u0131s\u0131 olas\u0131l\u0131\u011f\u0131na kar\u015f\u0131 periyodik yeniden ba\u015flatmalar ayarlamak rahatlat\u0131r. Swoole veya RoadRunner se\u00e7imi projene ve ekibinin al\u0131\u015fkanl\u0131klar\u0131na ba\u011fl\u0131. Ben genellikle daha sade kurulumlarla ba\u015flar, sonra yava\u015f yava\u015f yetenekleri a\u00e7ar\u0131m. Octane dev ortamda \u201chot reload\u201d ile i\u015ftah a\u00e7ar ama prod\u2019da izleme ve g\u00fcnl\u00fcklerle desteklemeden yaln\u0131z ba\u015f\u0131na b\u0131rakmam.<\/p>\n<h3><span id=\"Octane_ile_Queue_ve_Cachein_Dili_Ayni_Olmali\">Octane ile Queue ve Cache\u2019in Dili Ayn\u0131 Olmal\u0131<\/span><\/h3>\n<p>Octane h\u0131zl\u0131d\u0131r ama i\u015fi bitiren genellikle sahne arkas\u0131ndaki i\u015f\u00e7iler. Web iste\u011fini k\u0131sa tutup, pahal\u0131 i\u015fleri kuyruklara at\u0131nca Octane\u2019in ger\u00e7ek potansiyelini g\u00f6r\u00fcrs\u00fcn\u00fcz. Ayr\u0131ca cache katman\u0131n\u0131z tutarl\u0131 olmal\u0131. Redis ba\u011flant\u0131lar\u0131nda kal\u0131c\u0131 ba\u011flant\u0131 kullanmak, saniyelik minik gecikmeleri t\u00f6rp\u00fcler. Octane d\u00fcnyas\u0131nda her \u015feyi RAM\u2019e itmek cazip g\u00f6r\u00fcn\u00fcr, fakat invalidation stratejisi olmadan cache bir s\u00fcre sonra \u00e7al\u0131l\u0131k olur. Elle temizle, TTL koy, key adland\u0131rmalar\u0131n\u0131 d\u00fczenli yap. \u0130\u015fte huzur burada.<\/p>\n<h2 id=\"section-5\"><span id=\"QueueHorizon_Web_Isteginden_Ayrilan_Uzun_Islerin_Mutlu_Dunyasi\">Queue\/Horizon: Web \u0130ste\u011finden Ayr\u0131lan Uzun \u0130\u015flerin Mutlu D\u00fcnyas\u0131<\/span><\/h2>\n<p>Bir m\u00fc\u015fterim i\u00e7in raporlamay\u0131 web iste\u011fi i\u00e7inde yap\u0131yorduk. Kullan\u0131c\u0131 \u201cindir\u201d deyince PDF \u00fcretiliyor, d\u0131\u015f servislerle konu\u015fuluyor, derken sayfa bekliyor da bekliyor. Bunu kuyruklara ta\u015f\u0131d\u0131k; web taraf\u0131 sadece i\u015fi s\u0131raya koydu, kullan\u0131c\u0131 ya bildirim ald\u0131 ya da sayfay\u0131 yeniledi\u011finde haz\u0131r dosyay\u0131 g\u00f6rd\u00fc. An\u0131nda rahatlama. Laravel\u2019in <strong>Horizon<\/strong> paneli ise \u00e7al\u0131\u015fan i\u015f\u00e7ileri izlemek, kuyruk derinli\u011fini g\u00f6rmek ve ar\u0131za an\u0131nda do\u011fru d\u00fc\u011fmeye basmak i\u00e7in muazzam bir pencere.<\/p>\n<p>Supervisor konfig\u00fcrasyonunda her kuyru\u011fa ayn\u0131 g\u00f6zle bakm\u0131yorum. Kritik e-posta veya \u00f6deme sonras\u0131 i\u015flemler daha \u00f6ncelikli, raporlama ve ithalat daha sab\u0131rl\u0131 olabilir. <strong>timeout<\/strong>\u2019lar\u0131 ger\u00e7ek\u00e7i tutuyor, <strong>retry<\/strong> say\u0131s\u0131n\u0131 gereksiz \u015fi\u015firmiyorum; \u00e7\u00fcnk\u00fc yanl\u0131\u015f bir i\u015f sonsuza kadar tekrar edilince sadece vakit kaybedersiniz. <strong>memory limit<\/strong> ile worker\u2019lar\u0131 belirli bir noktada kibarca emekli etmek, k\u00fc\u00e7\u00fck s\u0131z\u0131nt\u0131lar\u0131n sisteme yay\u0131lmas\u0131n\u0131 engelliyor. Horizon\u2019da <em>balancing<\/em> ayarlar\u0131yla anl\u0131k dalgalar\u0131 g\u00fczelce emmek m\u00fcmk\u00fcn; bazen e\u015fit da\u011f\u0131t\u0131m, bazen a\u011f\u0131rl\u0131kland\u0131r\u0131lm\u0131\u015f bir yakla\u015f\u0131m daha iyi hissediliyor.<\/p>\n<h3><span id=\"Failed_Jobs_Gunlukler_ve_Sagduyu\">Failed Jobs, G\u00fcnl\u00fckler ve Sa\u011fduyu<\/span><\/h3>\n<p>Failed jobs koleksiyonunu \u00e7\u00f6p sand\u0131\u011f\u0131 gibi g\u00f6rmeyin. Orada biriken her kay\u0131t, sistemin size verdi\u011fi k\u00fc\u00e7\u00fck bir hediye. Neden? Hata kal\u0131plar\u0131n\u0131 g\u00f6r\u00fcr, idempotent tasar\u0131m\u0131n nereye kadar dayand\u0131\u011f\u0131n\u0131 anlars\u0131n\u0131z. Baz\u0131 i\u015fler iki kere yap\u0131l\u0131nca zarar veriyorsa, \u00f6nce i\u015fi idempotent hale getirin, sonra g\u00f6n\u00fcl rahatl\u0131\u011f\u0131yla yeniden deneyin. \u00dc\u00e7\u00fcnc\u00fc parti k\u0131s\u0131mlar i\u00e7in <em>backoff<\/em> stratejileri koymak, bir anda patlayan dalgalarda pristin kalman\u0131z\u0131 sa\u011flar.<\/p>\n<h2 id=\"section-6\"><span id=\"Redis_Ayarlari_Hafizanin_Hizli_Kurallarin_Net_Oldugu_Yer\">Redis Ayarlar\u0131: Haf\u0131zan\u0131n H\u0131zl\u0131, Kurallar\u0131n Net Oldu\u011fu Yer<\/span><\/h2>\n<p>Redis, Laravel\u2019de cache, oturum ve kuyruklar i\u00e7in \u00e7ok sevilen bir partner. Ama onun da s\u0131n\u0131rlar\u0131 var. \u00dcretimde en \u00e7ok g\u00f6rd\u00fc\u011f\u00fcm sorun, \u201cnas\u0131l olsa h\u0131zl\u0131\u201d denilerek her \u015feyin sonsuz tutulmas\u0131. Sonra bellek dolar, <strong>eviction<\/strong> devreye girer, kritik anahtarlar u\u00e7arsa kullan\u0131c\u0131lar beklenmedik durumlar g\u00f6r\u00fcr. \u00c7\u00f6z\u00fcm basit gibi: TTL\u2019siz key b\u0131rakma, <strong>maxmemory<\/strong> ve <strong>maxmemory-policy<\/strong>\u2019yi bilin\u00e7li se\u00e7, ve kritik veriyi ay\u0131r. Redis\u2019in resmi <a href=\"https:\/\/redis.io\/docs\/latest\/operate\/oss_and_stack\/management\/config\/\" rel=\"nofollow noopener\" target=\"_blank\">konfig\u00fcrasyon rehberi<\/a> sade bir referans sunuyor.<\/p>\n<p>Ba\u011flant\u0131 s\u00fcr\u00fcc\u00fcs\u00fc olarak PHP\u2019nin yerle\u015fik <strong>phpredis<\/strong> eklentisi pratik ve h\u0131zl\u0131. Laravel\u2019de s\u00fcr\u00fcc\u00fcy\u00fc ona g\u00f6re se\u00e7ip, prod\u2019da m\u00fcmk\u00fcnse <strong>UNIX socket<\/strong> kullanmak k\u00fc\u00e7\u00fck de olsa g\u00fczel bir kazan\u00e7. Ayn\u0131 sunucuda Nginx, PHP\u2011FPM, Redis ve database varsa, hepsi disk ve CPU\u2019yu payla\u015f\u0131r. Kaynak planlamas\u0131n\u0131 yaparken bu \u201ckom\u015fuluk\u201d ili\u015fkisini unutmay\u0131n. E\u011fer Redis\u2019i d\u0131\u015far\u0131ya al\u0131rsan\u0131z, a\u011f gecikmesi eklenir ama CPU ve RAM bask\u0131s\u0131 sunucudan kalkar; burada dengeyi trafi\u011fin ve b\u00fct\u00e7enin ritmi belirler.<\/p>\n<h3><span id=\"Key_Adlandirma_TTL_ve_Izleme\">Key Adland\u0131rma, TTL ve \u0130zleme<\/span><\/h3>\n<p>Key adland\u0131rmas\u0131n\u0131 d\u00fczenli yaparsan\u0131z ar\u0131zay\u0131 anlamak kolayla\u015f\u0131r. <code>app:cache:user:123<\/code> gibi hiyerar\u015fik adlar, birikimi g\u00f6zle g\u00f6r\u00fcn\u00fcr hale getirir. TTL taraf\u0131nda kritik giri\u015flere \u00f6l\u00e7\u00fcl\u00fc ya\u015fam s\u00fcresi verin; kal\u0131c\u0131 olmas\u0131 gerekenleri bilerek kal\u0131c\u0131 tutun. \u201cHepsine bir g\u00fcn\u201d demek bazen gereksiz invalidation f\u0131rt\u0131nas\u0131 yarat\u0131r, bazen de gereksiz b\u00fcy\u00fcmeye sebep olur. \u0130zleme taraf\u0131nda <strong>latency<\/strong> grafikleri ve <strong>evicted_keys<\/strong> say\u0131lar\u0131 size erken uyar\u0131 verir.<\/p>\n<h2 id=\"section-7\"><span id=\"Dagitim_Ritueli_Koddan_Konfige_Konfigden_Gozleme\">Da\u011f\u0131t\u0131m Rit\u00fceli: Koddan Konfige, Konfigden G\u00f6zleme<\/span><\/h2>\n<p>Prod\u2019da da\u011f\u0131t\u0131m t\u00f6ren gibidir. Heyecanl\u0131d\u0131r ama plan varsa sakindir. Kod taraf\u0131nda <strong>config:cache<\/strong>, <strong>route:cache<\/strong>, <strong>view:cache<\/strong> ad\u0131mlar\u0131n\u0131 d\u00fczenli uygular\u0131m. Composer\u2019da <strong>&#8211;no-dev<\/strong> ve <strong>&#8211;optimize-autoloader<\/strong>, build s\u00fcrecinin vazge\u00e7ilmezi. \u00c7evresel de\u011fi\u015fkenleri netle\u015ftirip, <strong>php artisan optimize<\/strong> ile uygulamay\u0131 toparlamak da al\u0131\u015fkanl\u0131k. Ard\u0131ndan OPcache i\u00e7in nazik bir <em>reload<\/em>, FPM s\u00fcre\u00e7leri dans\u0131n\u0131 bozmadan tazelenir.<\/p>\n<p>Nginx\u2019te upstream zaman a\u015f\u0131m\u0131 de\u011ferleri, sa\u011fl\u0131kl\u0131 bir i\u015f b\u00f6l\u00fcm\u00fc i\u00e7in ayarl\u0131 olmal\u0131. Web sunucu \u201ci\u015f bende de\u011fil\u201d demeyi bilmeli, FPM \u201cbu kadar beklemem\u201d diyebilmeli, kuyruklar \u201cbana b\u0131rak\u201d diye almal\u0131. Log rotasyonu, disk doluluk alarmlar\u0131, CPU\/RAM izleme\u2026 Bunlar yoksa, sorun da\u011fdayken \u201cneden\u201d sorusunun cevab\u0131 \u015fehrin di\u011fer ucunda kal\u0131r. \u0130zleme i\u00e7in harici paneller \u00e7ok yard\u0131mc\u0131 olur; isterseniz <a href=\"https:\/\/www.dchost.com\/blog\/vps-izleme-ve-uyari-nasil-kurulur-prometheus-grafana-ve-node-exporter-ile-sessiz-alarmlari-konusturmak\/\">Prometheus ve Grafana ile sessiz alarmlar\u0131 konu\u015fturdu\u011fum yaz\u0131ya<\/a> da g\u00f6z atabilirsiniz.<\/p>\n<h2 id=\"section-8\"><span id=\"Gercek_Bir_Akis_Kaynak_Planlama_Havuz_Cache_ve_Kuyruk_El_Sikisiyor\">Ger\u00e7ek Bir Ak\u0131\u015f: Kaynak Planlama, Havuz, Cache ve Kuyruk El S\u0131k\u0131\u015f\u0131yor<\/span><\/h2>\n<p>Bir projede sabahlar\u0131 anl\u0131k trafik dalgas\u0131 oluyordu. \u0130lk hamle olarak CPU ve RAM\u2019i \u00f6l\u00e7t\u00fck, en pahal\u0131 u\u00e7lar\u0131 profilledik. Sonra FPM\u2019de process say\u0131s\u0131n\u0131 kaba kuvvet art\u0131rmak yerine, ortalama process RAM t\u00fcketimine g\u00f6re ak\u0131ll\u0131ca ayarlad\u0131k. OPcache haf\u0131zas\u0131n\u0131 biraz geni\u015flettik, validate_timestamps\u2019i kapat\u0131p d\u00fczenli reload\u2019a ge\u00e7tik. Web isteklerinin i\u00e7indeki raporlar ve dosya i\u00e7e aktar\u0131mlar\u0131n\u0131 kuyruklara ta\u015f\u0131y\u0131nca, web tepkisi g\u00f6zle g\u00f6r\u00fcl\u00fcr h\u0131zland\u0131. Redis\u2019te TTL\u2019leri yeniden d\u00fc\u015f\u00fcnerek kritik anahtarlar\u0131 u\u00e7maktan kurtard\u0131k.<\/p>\n<p>Bu d\u00fczenin \u00fcst\u00fcne Octane\u2019i koydu\u011fumuzda, uygulaman\u0131n s\u0131cak tutulan belle\u011fi h\u0131zl\u0131 cevaplar vermeye ba\u015flad\u0131. Stateful s\u00fcrprizleri yakalamak i\u00e7in birka\u00e7 k\u00fc\u00e7\u00fck d\u00fczeltme yapt\u0131k: baz\u0131 singleton\u2019lar\u0131 request ba\u015f\u0131na yenilettik, \u201ckullan\u0131c\u0131 ba\u011flam\u0131\u201d gibi verileri asla kal\u0131c\u0131 hale getirmedik. Horizon ile sabah dalgas\u0131 gelmeden worker say\u0131s\u0131n\u0131 art\u0131racak ufak bir otomasyon yazd\u0131k, sonra dalga bittikten sonra gereksiz s\u00fcre\u00e7leri azaltt\u0131k. En sonunda kullan\u0131c\u0131lar sadece \u201ch\u0131zl\u0131 olmu\u015f\u201d dediler. Bazen tek iltifat budur.<\/p>\n<p>Kapasite planlamas\u0131 taraf\u0131nda karars\u0131zsan\u0131z, zaman ay\u0131r\u0131p \u015funa da bakabilirsiniz: <a href=\"https:\/\/www.dchost.com\/blog\/woocommerce-laravel-ve-node-jsde-dogru-vps-kaynaklarini-nasil-secersin-cpu-ram-nvme-ve-bant-genisligi-rehberi\/\">Laravel ve Node.js\u2019de do\u011fru VPS kaynaklar\u0131n\u0131 nas\u0131l se\u00e7ersiniz<\/a>. Donan\u0131m fikrinizi tazelemek, yaz\u0131l\u0131m ayarlar\u0131 i\u00e7in g\u00fczel bir arka plan sa\u011fl\u0131yor. Unutmay\u0131n, kod, konfig ve kaynaklar birbirini tamamlad\u0131\u011f\u0131nda sonu\u00e7 ger\u00e7ek anlamda kal\u0131c\u0131 hale geliyor.<\/p>\n<h2 id=\"section-9\"><span id=\"Kapanis_Vidalari_Sik_Sahneden_Yavasca_Cekil\">Kapan\u0131\u015f: Vidalar\u0131 S\u0131k, Sahneden Yava\u015f\u00e7a \u00c7ekil<\/span><\/h2>\n<p>Prod ortam\u0131n\u0131 optimize etmek h\u0131zl\u0131ca biten bir g\u00f6rev de\u011fil; biraz g\u00f6zlem, biraz sab\u0131r, bolca k\u00fc\u00e7\u00fck dokunu\u015f istiyor. PHP\u2011FPM havuzlar\u0131n\u0131n nefesini a\u00e7t\u0131\u011f\u0131n\u0131zda web istekleri bo\u015f yere beklemez. OPcache\u2019i do\u011fru kurdu\u011funuzda dosyalar her defas\u0131nda yeniden \u0131s\u0131nmaya \u00e7al\u0131\u015fmaz. Octane\u2019i disiplinle kullan\u0131nca s\u0131cak s\u00fcre\u00e7ler size h\u0131z kazand\u0131r\u0131r. Queue\/Horizon sayesinde uzun s\u00fcren i\u015fler sahneden \u00e7ekilir, Redis iyi ayarland\u0131\u011f\u0131nda cache size dost kal\u0131r.<\/p>\n<p>Pratik bir kapan\u0131\u015f re\u00e7etesi b\u0131rakay\u0131m: \u0130\u015fleri kuyruklara ta\u015f\u0131, FPM\u2019de process say\u0131s\u0131n\u0131 RAM\u2019e g\u00f6re belirle, OPcache\u2019in belle\u011fini ve do\u011frulama ayarlar\u0131n\u0131 prod\u2019a uygun yap, Octane\u2019de state\u2019i temiz tuttu\u011fundan emin ol, Redis\u2019te TTL ve maxmemory\u2019yi bilin\u00e7li se\u00e7. Sonra otur ve g\u00f6zle. Loglar konu\u015fsun, grafikler rehberlik etsin. Umar\u0131m bu yaz\u0131 i\u015finize yarar ve gece yar\u0131s\u0131 gelen 502\u2019ler bir daha yolunuzu \u015fa\u015f\u0131rmaz. Bir dahaki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere.<\/p>\n<h2 id=\"section-10\"><span id=\"Bonus_Kucuk_Komut_Ajandasi\">Bonus: K\u00fc\u00e7\u00fck Komut Ajandas\u0131<\/span><\/h2>\n<p>\u00c7o\u011fu zaman not defterime \u015funlar\u0131 yazar\u0131m, burada dursun:<br \/>\n<code>php artisan config:cache<\/code>, <code>php artisan route:cache<\/code>, <code>php artisan view:cache<\/code><br \/>\n<code>php artisan queue:restart<\/code> (Horizon\/worker\u2019lar nazik\u00e7e yenilensin diye)<br \/>\n<code>sudo systemctl reload php-fpm<\/code> veya da\u011f\u0131t\u0131m\u0131n\u0131za uygun reload komutu (OPcache tazelenir)<br \/>\nGeri kalan her \u015fey, sakin bir kafayla bak\u0131nca zaten kendini g\u00f6sterir.<\/p>\n<h2 id=\"section-11\"><span id=\"Kaynak_Notlari\">Kaynak Notlar\u0131<\/span><\/h2>\n<p>Detaylara tak\u0131ld\u0131\u011f\u0131n\u0131zda \u015fu referanslar sade birer harita gibi i\u015f g\u00f6r\u00fcyor: <a href=\"https:\/\/www.php.net\/manual\/en\/opcache.configuration.php\" rel=\"nofollow noopener\" target=\"_blank\">OPcache yap\u0131land\u0131rma ayarlar\u0131<\/a>, <a href=\"https:\/\/laravel.com\/docs\/octane\" rel=\"nofollow noopener\" target=\"_blank\">Laravel Octane dok\u00fcmanlar\u0131<\/a>, <a href=\"https:\/\/redis.io\/docs\/latest\/operate\/oss_and_stack\/management\/config\/\" rel=\"nofollow noopener\" target=\"_blank\">Redis konfig\u00fcrasyon rehberi<\/a>. Hepsini ezberlemek gerekmiyor; arad\u0131\u011f\u0131n\u0131z\u0131 h\u0131zl\u0131ca bulmak yetiyor.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Bir Gece Yar\u0131s\u0131 Gelen 502\u2019ler ve D\u00fc\u011f\u00fcm D\u00fc\u011f\u00fcm Prod Ayarlar\u01312 PHP\u2011FPM Havuzlar\u0131: Yan Yana \u00c7al\u0131\u015fan \u0130\u015f\u00e7iler Nas\u0131l Nefes Al\u0131r?2.1 \u0130lk Temas: Zaman A\u015f\u0131m\u0131 ve Kuyruk Etkisi2.2 Loglar, yava\u015flar ve g\u00f6r\u00fcn\u00fcrl\u00fck3 OPcache: Haf\u0131zan\u0131n \u0130\u00e7inde S\u0131cak Tutan Battaniye3.1 Deploy Anlar\u0131nda OPcache\u2019i \u00dcrk\u00fctmeden Yenilemek4 Octane: Oyun De\u011fi\u015ftirici H\u0131z m\u0131, Dikkatli Kullan\u0131lmas\u0131 Gereken G\u00fc\u00e7 m\u00fc?4.1 Octane ile Queue [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1403,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-1402","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=1402"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1402\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/1403"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=1402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=1402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=1402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}