လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> session_GC ကိုအသုံးပြုသည့်အခါ session_GC ကိုအသုံးပြုသောအခါဘာဘုံပြ problems နာများကြုံတွေ့ရသနည်း။ ဘယ်လိုဖြေရှင်းမလဲ

session_GC ကိုအသုံးပြုသည့်အခါ session_GC ကိုအသုံးပြုသောအခါဘာဘုံပြ problems နာများကြုံတွေ့ရသနည်း။ ဘယ်လိုဖြေရှင်းမလဲ

gitbox 2025-06-17

1 ။ Session_GC () က အချိန်မီမသန့်ရှင်းပါ


developer များသတိပြုမိသူများသည် session lifecycy ကိုသတ်မှတ်ထားသည့်တိုင်, ဤသည်များသောအားဖြင့် session_gc () က တောင်းဆိုမှုတိုင်းကိုမကွပ်မျက်ဘူး။

အကြောင်းရင်းကိုဖြစ်ပေါ်စေသည်
PHP ၏ Session Recycling ယန္တရားသည်ဖြစ်နိုင်ခြေအပေါ် အခြေခံ. အစပျိုးထားပြီး default configuration သည်အောက်ပါအတိုင်းဖြစ်သည် -

 session.gc_probability = 1
session.gc_divisor = 100

ဆိုလိုသည်မှာပျမ်းမျှအားဖြင့်တောင်းဆိုမှု 100 တိုင်းတွင် 1 ခုသာ GC စစ်ဆင်ရေးကိုဖြစ်ပေါ်စေသည်။

ဖြေရှင်းချက် -
GC ခလုတ်များဖြစ်နိုင်ခြေကိုတိုးမြှင့်ခြင်းသို့မဟုတ် Session_GC ကို ခေါ်ခြင်းဖြင့်သန့်ရှင်းရေးလုပ်နိုင်သည်။

 ini_set('session.gc_probability', 100);
ini_set('session.gc_divisor', 100);

သို့မဟုတ်အချိန်တန်လျှင်အသုံးပြုပါ။

 session_start();
session_gc();

2 ။ စိတ်ကြိုက် session processor သည် GC () နည်းလမ်းကိုမှန်ကန်စွာအကောင်အထည်မပေးပါ

ပြနာဖော်ပြချက်:
GC သည်စိတ်ကြိုက်အစည်းအဝေးချွေတာခြင်းယန္တရားများကိုအသုံးပြုသည့်အခါအကျိုးသက်ရောက်မှုမရှိပါ (ဥပမာ databases, redis စသည်)

အကြောင်းရင်းကိုဖြစ်ပေါ်စေသည်
အကယ်. GC () နည်းလမ်းကိုထုံးစံ sessionhandler အတန်းထဲတွင်မမှန်ကန်ပါက PHP မှ Session_GC () ဟုခေါ်ဆိုသည့်အခါဒေတာများကိုအမှန်တကယ်သန့်ရှင်းပစ်မည်မဟုတ်ပါ။

ဖြေရှင်းချက် -
SessionHandlerinterface တွင် GC () နည်းလမ်းကိုအကောင်အထည်ဖော်ရန်သေချာပါစေ။ ဥပမာ, အကယ်. သင်သည် session ကိုသိမ်းရန် MySQL ကိုအသုံးပြုပါက၎င်းကိုသင်ဤကဲ့သို့သောအကောင်အထည်ဖော်နိုင်သည်။

 class MySessionHandler implements SessionHandlerInterface {
    // ...

    public function gc($max_lifetime) {
        $stmt = $this->pdo->prepare("DELETE FROM sessions WHERE last_access < :time");
        $stmt->execute([':time' => time() - $max_lifetime]);
        return true;
    }
}

ထို့နောက်မှတ်ပုံတင်ပါ

 $handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

3 ။ session.save_path configuration ပြ problem နာ

ပြနာဖော်ပြချက်:
session_gc () ကိုခေါ်လျှင်ပင်, session file ဟောင်းကိုမဖျက်သေးပါ။

အကြောင်းရင်းကိုဖြစ်ပေါ်စေသည်
ဤသည် session.save_path မှားယွင်းနေသောလမ်းညွှန်သို့မဟုတ်ခွင့်ပြုချက်မလုံလောက်သောကြောင့်ဖြစ်နိုင်သည်။

ဖြေရှင်းချက် -
မှန်ကန်သော Save Path ကိုသတ်မှတ်ထားကြောင်းနှင့် PHP လုပ်ငန်းသည်စာဖတ်ခြင်းနှင့်ရေးသားရန်ခွင့်ပြုချက်ရှိကြောင်းသေချာပါစေ။

 ini_set('session.save_path', '/var/lib/php/sessions');

ဖိုလ်ဒါခွင့်ပြုချက်ကိုစစ်ဆေးပါ။

 sudo chown -R www-data:www-data /var/lib/php/sessions
sudo chmod 700 /var/lib/php/sessions

4 ။ session_gc () ကို အသုံးပြု. command line တွင်မမှန်ကန်ပါ

ပြနာဖော်ပြချက်:
Session_GC () CLI MODE (ထိုကဲ့သို့သောအချိန်ကိုက် scripts များကဲ့သို့) cli mode တွင်ခေါ်ဆိုခြင်းသို့မဟုတ်အမှားအယွင်းမရှိပါ။

အကြောင်းရင်းကိုဖြစ်ပေါ်စေသည်
CLI ပတ် 0 န်းကျင်သည်မှန်ကန်သော session configuration (save_path လုပ်ခြင်းကဲ့သို့သော) ကို အစပြု. မခေါ်ပါ။ သို့မဟုတ်ခေါ်ဆိုမှုကိုမခေါ်မီ session ကိုမဖော်ပြပါ။

ဖြေရှင်းချက် -
Session_GC ကို မခေါ်မီပတ်ဝန်းကျင်ကိုအတိအလင်းရှင်းလင်းစွာစစ်ဆေးပါ။

 ini_set('session.save_handler', 'files');
ini_set('session.save_path', '/var/lib/php/sessions');
session_gc();

5 ။ အမှိုက်သရိုက် session ကိုမသန့်ရှင်းပါ။ ၎င်းသည်စွမ်းဆောင်ရည်ကိုသက်ရောက်စေသည်

ပြနာဖော်ပြချက်:
အချို့သော 0 ဘ်ဆိုဒ်များသည်အချိန်ကြာမြင့်စွာလည်ပတ်ပြီးနောက် .Sess ဖိုင်များသည် disk space များစွာတက်သည်။ / tmp directory တွင်သိမ်းဆည်းထားသည်။

အကြောင်းရင်းကိုဖြစ်ပေါ်စေသည်
အကယ်. ထိရောက်သော GC သည်အချိန်ကြာမြင့်စွာလုပ်ဆောင်နိုင်ခြင်းမရှိပါက GC ကြိမ်နှုန်းသည်အလွန်နိမ့်သည်။

ဖြေရှင်းချက် -
သီးခြားစီစဉ်ထားသည့် task script တစ်ခုတည်ဆောက်ရန်နှင့် session_gc () ကို ပုံမှန်ခေါ်ဆိုရန်အကြံပြုသည်။ ဥပမာအားဖြင့်တစ်နာရီတစ်ကြိမ်ပြေးပါ။

 <?php
ini_set('session.save_path', '/var/lib/php/sessions');
session_gc();

Linux cron tasks နှင့်ပေါင်းစပ်:

 0 * * * * /usr/bin/php /var/www/html/session_gc.php

6 ။ အေးဂျင့်သို့မဟုတ် Balancing ပတ်ဝန်းကျင်နှင့်အတူသဟဇာတ

ပြနာဖော်ပြချက်:
Load Balancing သို့မဟုတ် Reverse proxy ပတ်ဝန်းကျင်တွင်ကွဲပြားခြားနားသော node များသည် session data data များကိုထပ်တူပြုခြင်း,

ဖြေရှင်းချက် -
ဗဟိုသို့မဟုတ်ဒေတာဘေ့စ်များကဲ့သို့သောဗဟို session သိုလှောင်မှုကိုအသုံးပြုရန်နှင့် GC ပေါ်လစီကိုစည်းလုံးညီညွှတ်ပါ။

 ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://gitbox.net:6379');

Redis Scheme တွင် Redis ၏သက်တမ်းကုန်ဆုံးသည့်ယန္တရားကိုပုံမှန်သန့်ရှင်းရေးပြုလုပ်သင့်သည်သို့မဟုတ် Redis ကိုအလိုအလျှောက်ဖြင့်အလိုအလျောက်ပြုလုပ်နိုင်သည်။