Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
  • Yardım
  • Anlık 2500 kişi yüklenince site çökmesi hk.

Controller'da IP için aşağıdaki fonksiyon vardı ama yazmışım öyle kalmış. Herhangi bir yerde kullanmıyordum. O kodu silince gayet stabil gördüm sistemi. Bu tür kodlar, kullanılmadığı halde sistemi yorar mı?

   public function GetIP()
    {
        if(getenv("HTTP_CLIENT_IP")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } elseif(getenv("HTTP_X_FORWARDED_FOR")) {
            $ip = getenv("HTTP_X_FORWARDED_FOR");
            if (strstr($ip, ',')) {
                $tmp = explode (',', $ip);
                $ip = trim($tmp[0]);
            }
        } else {
            $ip = getenv("REMOTE_ADDR");
        }
        return $ip;
    }

    alaca33
    Hayır.
    Bu fonksiyon kullanılmıyorsa bir etkisi olmaz.
    Bence sorununuz başka bir şey idi.

    alaca33 getenv PHP içindeki sabitlerden 5 kat daha yavaştır. Tek bir istekte birden fazla çağrıldığında ve çok sayıda değişken olduğunda performans sorunu oluşturabilir fakat bir yerde kullanmadım demişsiniz, o yüzden bilmiyorum. Ayrıca IP adresini $request->ip() şeklinde alabilirsiniz.

    Laravellik bir sıkıntı değildir bu.Ha laravelin requesti kendi icinde framework olmasından dolayı zaten pure php gibi değildir tabi,ama sorun laravel kaynaklı değildir.Querylerinizi takibe alın.Mutlaka optimize etmeniz gereken yerler olabilir.Birde böyle fonksiyonlar niye kullanıyorsunuz.Framework zaten yapmıs size bunları.request->ip gibi kullanabilirsiniz @mgsmus un yazdıgı gibi..

    2 ay sonra

    Henüz CPU problemini aşamadık. Basit bir post ve login işleminde, %60 CPU buluyor sistem.

    Sistemimiz istek gönderilen site.com/{subdomain} şeklinde {subdomain} üzerinden çalışıyor. {subdomain} eğer veritabanında var ise veritabanına bağlanıp ilgili {subdomain} e ait veriler çekilerek oturum açma ve yayın bilgilerinin çekilmesi işlemleri yapılıyor.

    Route içeriği:

    Route::get('{subdomain}/giris', 'Auth\DinleyiciLoginController@index')->name('dinleyici.login');
    Route::post('giris', 'Auth\DinleyiciLoginController@login')->name('dinleyici.login.post');
    Route::get('{subdomain}/cikis', 'Auth\DinleyiciLoginController@logout')->name('dinleyici.logout');
    
    Route::middleware('isDinleyici')->group(function () {
        Route::get('{subdomain}', 'Auth\DinleyiciController@index')->name('dinleyici.anasayfa');
        Route::post('yayinYenile', 'Auth\DinleyiciController@yenile')->name('dinleyici.yayinYenile');
    });

    DinleyiciLoginController sayfası içeriği

    public function index($subdomain)
    {
    	$yayinVarMi = Yayinlar::where('subdomain' , $subdomain)->count();
    
    	if($subdomain == '') {
    		$yonlendirme = false;
    	} elseif($yayinVarMi>0) {
    		$yayinBilgisi = Yayinlar::where('subdomain', $subdomain)->first();
    		$yonlendirme = true;
    	} else {
    		$yonlendirme = false;
    	}
    	
    	if($yonlendirme) {
    		$data['subdomain']  = $subdomain;
    		return view('front.auth.login', $data);
    	} else {
    		return abort(404);
    	}
    }

    DinleyiciController sayfası içeriği

    public function index($subdomain)
        {
            $domain         = $subdomain;
            $sorgu          = Yayin::where('subdomain' , $subdomain);
            $yayinVarMi     = $sorgu->count();
    
            if($domain == '') {
                return '';
            } elseif($yayinVarMi>0) {
                $yayinBilgisi = $sorgu->first();
    
                if((session('yayin_id') == $yayinBilgisi->id)) {
                    if($yayinBilgisi->sunucu_linki2 == '') {
                        $data['yayinLinki'] = $yayinBilgisi->sunucu_linki1;
                    } else {
                        $data['yayinLinki'] = $yayinBilgisi->sunucu_linki2;
                    }
                    $data['yayinBilgisi']   = $yayinBilgisi;
                    $data['subdomain']      = $domain;
                    return view('front.anasayfa.index4', $data);
                } else {
                    session()->flush();
                    return redirect()->route('dinleyici.login', $subdomain);
                }
            } else {
                return '';
            }
        }

    isDinleyici Middleware içeriği:

    public function handle($request, Closure $next)
        {
            $domain         = ltrim($request->getRequestUri(), '/');
            $yayinVarMi     = Yayin::where('subdomain' , $domain)->count();
    
            if($domain == '') {
                $yayinBilgisi = '';
                $yonlendirme  = false;
            } elseif($yayinVarMi > 0) {
                $yayinBilgisi = Yayin::where('subdomain', $domain)->first();
                $yonlendirme  = true;
            } else {
                $yayinBilgisi = '';
                $yonlendirme  = false;
            }
    
            if(session('dinleyiciOturum')) {
                return $next($request);
            } else {
                if($yonlendirme AND (session('yayin_id') == $yayinBilgisi->id)) {
                    return redirect()->route('dinleyici.login', ['subdomain' => $domain]);//abort(403);
                } else {
                    return redirect()->route('dinleyici.login', ['subdomain' => $domain]);//abort(403);
                }
            }
        }

      alaca33 db sorgularınızı cache'e alabilirsiniz. Yeni güncelleme olduğunda cache temizlersiniz.

      Debugbar kurarak kontrol ederek ilerlerseniz daha kolay olabilir.

        Dostum, Laravelde yeniyim fakat php ve network bilgim mevcut. Laravel kodlarına baktığımda herhangi bi bir şekilde request işlemini çok fazla döndürüp bir cpu işleyecek ilem göremedim. Eğer host satın almadıysanız
        Dedicatedinize girin ve sistemin network ve cpu işlemci bazlı doğru çalıştığından emin olun.
        eğer oda değilse bir cloudflare üzerinden cdn hizmeti alarak 2500 kişinin aynanda giriş sağlamasını beli aralıklarla (cloudflare kendisi otomatik yapıcağı işlemdir.) girmesini sağlar ve böylece yoğun yük ortamı biraz daha azalmış olabilir tabikide üstadlar benden daha iyi olabilir yazılım konusunda belki bi yerde cpu şişiricek bir işlem yapmaya devam ediyordur.

        2 Olarak aldığınız bana göre önerim, server timeout sürelerinin az olmasından kaynaklanmaktadır.
        şu aşamaları takip edin:

        1. web serverinizin çalışma durumunu sağlayan ne ise onun .conf dosyasına
        2. timeout 500
        3. proxytimeout 500
          Yazarak sonrasında ise web servis sağlayıcınızı yenileyerek bu sorunu çözebilirsiniz gibime geliyor. Denemenizde fayda var.

        Anlık birkaç bin kişi giriyor ama girişta yaptığımız sorgulama çok basit ve başka sitede hiçbir işlem yapmıyor ziyaretçiler.

        Tavsiye edildiği üzere cache işlemini araştırdım ve aşağıdaki gibi yaptım. Buna rağmen CPU kullanımı %60'a değmek üzere. Kontrol edip, hata yaptığım yer olup olmadığına bakabilir misiniz?

        App/Cache/Yayinlar.php diye dosya oluşturdum ve içine şunları yazdım:

        <?php
        namespace App\Cache;
        
        use Illuminate\Support\Facades\Cache;
        use Illuminate\Support\Facades\DB;
        
        class Yayinlar
        {
            public static function bul($subdomain)
            {
                $key = "get.{$subdomain}";
                $cacheKey = "YAYINLAR.".$key;
        
                $value = Cache::remember($cacheKey, 300, function () use ($subdomain) {
                    return DB::table('yayinlarss')->where('subdomain', '=', $subdomain)->first();
                });
        
                return $value;
            }
        }

        Bunu da LoginController içerisinde şöyle kullandım:

        public function index($subdomain)
            {
                $sorgu = Yayinlar::bul($subdomain);
                if(!empty($sorgu)) {
                    $yayinVarMi = 1;
                } else {
                    $yayinVarMi = 0;
                }
        
                if($subdomain == '') {
                    $yonlendirme = false;
                } elseif($yayinVarMi>0) {
                    $yayinBilgisi = $sorgu;
                    $yonlendirme = true;
                } else {
                    $yonlendirme = false;
                }
        
                if($yonlendirme) {
                    $data['yayin_adi']   = $yayinBilgisi->yayin_adi;
                    $data['subdomain']  = $subdomain;
                    return view('front.auth.login', $data);
                } else {
                    return abort(404);
                }
            }

        coder2

        Hocam debugbar kurdum ve sorgu sayısı sıfır görünüyor. Cache de çalışıyor görünüyor. Buna rağmen cache yapmadan öncekinden hiç farkı yok. CPU kullanımı hala en üst seviyede.

        Laravel performansı ile ilgili benim bilmediğim birşeyler var sanırım. 🙁

          @alaca33 Hata kayıtlarınıza bakın. /var/log/messages ayrıca sitenin hata kayıtlarını inceleyin. Bu kısımda bir sorun yok ise bir kaç kod ve fonksiyondan oluşan bir php dosyası oluşturun ve stres teste sokun. Disk arızası ve ram arızası işletim sistemi sorunu veya php derleyici sorunu olabilir bir çok şey olabilir. Test etmeniz lazım.

          alaca33 Laravel error log ları ve sunucu log larını kontrol edin o zaman hocam. Sorgularda problem yoksa sunucu tarafında hata oluşuyor olabilir veya kodlarınız biryerlerde loop e giriyor olabilir.