လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> SessionHandler ၏အကောင်အထည်ဖော်မှုနည်းလမ်းများ --: Database session သိုလှောင်မှုနှင့်အတူဖွင့်လှစ်? ထိရောက်သောနှင့်တည်ငြိမ်သောဒေတာဘေ့စ်အစည်းအဝေးများအောင်မြင်ရန်ဘယ်လို?

SessionHandler ၏အကောင်အထည်ဖော်မှုနည်းလမ်းများ --: Database session သိုလှောင်မှုနှင့်အတူဖွင့်လှစ်? ထိရောက်သောနှင့်တည်ငြိမ်သောဒေတာဘေ့စ်အစည်းအဝေးများအောင်မြင်ရန်ဘယ်လို?

gitbox 2025-07-15

မျက်မှောက်ခေတ် Web Development တွင် PHP ၏ Session စီမံခန့်ခွဲမှုသည်အသုံးပြုသူများအခြေအနေကိုထိန်းသိမ်းရန်နှင့်မတူညီသောစာမျက်နှာတောင်းဆိုမှုများအကြားအသုံးပြုသူအချက်အလက်များကိုသိမ်းဆည်းထားသည့်အတွက် PHP ၏ Session စီမံခန့်ခွဲမှုသည်အဓိကအစိတ်အပိုင်းဖြစ်သည်။ ရိုးရာ session သိုလှောင်မှုနည်းလမ်းများသည်ဖိုင်စနစ်များပေါ်တွင်အခြေခံသည်။ ထို့ကြောင့် Session Information ကိုသိုလှောင်ရန်ဒေတာဘေ့စ်များကိုအသုံးပြုခြင်းသည်တဖြည်းဖြည်းဘုံအလေ့အကျင့်တစ်ခုဖြစ်လာသည်။

PHP တွင် Sessionhandler အတန်းသည် developer များအား storage storage method များကိုစိတ်ကြိုက်ပြုလုပ်ရန်ခွင့်ပြုသည့်ယန္တရားကိုပေးသည်။ sessionhandler interface ကိုအကောင်အထည်ဖော်ခြင်းအားဖြင့်အစည်းအဝေးများကိုဒေတာဘေ့စ်တွင်သိမ်းဆည်းထားနိုင်သည်။

ဤဆောင်းပါးသည် SessionHandler မှတဆင့် session ကိုမည်သို့အကောင်အထည်ဖော်ရမည်ကိုဆွေးနွေးပါမည်။ : Database နှင့်အတူဖွင့်ပြီး ထိရောက်သောတည်ငြိမ်သောဒေတာဘေ့စ်အစည်းအဝေးစနစ်ကိုမည်သို့အကောင်အထည်ဖော်ရမည်ကိုဆွေးနွေးပါမည်။

1 ။ SessionHandler လူတန်းစားနှင့်ဒေတာဘေ့စ် session သိုလှောင်မှု

PHP ၏ built-in session processing method (ပုံမှန်အားဖြင့်ဖိုင်သိုလှောင်ခြင်း) ကိုထုံးစံ sessionhandler ဖြင့်အစားထိုးနိုင်သည်။ PHP သည် session တစ်ခုကိုတောင်းဆိုသောအခါ sessionhandler သည် အောက်ပါအဓိကနည်းလမ်းများကိုလုပ်ဆောင်လိမ့်မည်။

  • ပွင့်လင်းသော ($ suppath, $ somename) : session သိုလှောင်မှုဖွင့်လှစ်။

  • အနီးကပ် () : session သိုလှောင်မှုကိုပိတ်ပါ။

  • Read ($ sessionid) - သတ်မှတ်ထားသော session ID ၏ session data ကိုဖတ်ပါ။

  • ရေးရန် ($ sessionID, $ ဒေတာ) - session data ကိုရေးပါ။

  • ဖျက်ဆီးခြင်း ($ session) : session ကိုဖျက်စီးပါ။

  • GC ($ Maxlifetime) : အမှိုက်သရိုက်များကိုလုပ်ဆောင်သည်။

ဤနည်းလမ်းများကိုပြန်လည်ရေးခြင်းအားဖြင့် developer များသည်ဖိုင်စနစ်ပေါ်တွင်သာမှီခိုမည့်အစား developer များ session data တစ်ခုသို့သိမ်းဆည်းနိုင်သည်။

2 ။ အကောင်အထည်ဖော်မှုအဆင့်များ

အောက်ဖော်ပြပါဒေတာဘေ့စ်တွင် session data တွင် session data တွင်သိမ်းဆည်းရန်အခြေခံအဆင့်များဖြစ်သည်။

အဆင့် 1 - ဒေတာဘေ့စ်စားပွဲတစ်ခုဖန်တီးပါ

ပထမ ဦး စွာသင်ခန်းစာအချက်အလက်များကိုသိမ်းဆည်းရန်ဒေတာဘေ့စ်တွင်ဇယားတစ်ခုဖန်တီးရန်လိုအပ်သည်။ ဇယားဖွဲ့စည်းပုံ၏အခြေခံဥပမာမှာ -

 <span><span><span class="hljs-keyword">CREATE</span></span><span> </span><span><span class="hljs-keyword">TABLE</span></span><span> `sessions` (
    `session_id` </span><span><span class="hljs-type">varchar</span></span><span>(</span><span><span class="hljs-number">255</span></span><span>) </span><span><span class="hljs-keyword">NOT</span></span><span> </span><span><span class="hljs-keyword">NULL</span></span><span>,
    `session_data` text </span><span><span class="hljs-keyword">NOT</span></span><span> </span><span><span class="hljs-keyword">NULL</span></span><span>,
    `last_access` </span><span><span class="hljs-type">int</span></span><span>(</span><span><span class="hljs-number">11</span></span><span>) </span><span><span class="hljs-keyword">NOT</span></span><span> </span><span><span class="hljs-keyword">NULL</span></span><span>,
    </span><span><span class="hljs-keyword">PRIMARY</span></span><span> KEY (`session_id`)
);
</span></span>

Session_DATA စတိုး ဇီများ sessions session data session data နှင့် last_access session ကိုသီးခြား session တစ်ခုနှင့် session_id ident_id ကိုအသုံးပြုသည်။

အဆင့် 2 - sessionhandler အတန်းကိုစိတ်ကြိုက်ပြုလုပ်ပါ

ထို့နောက် sessionhandler ကို အမွေဆက်ခံသည့်အတန်းတစ်ခုသည် session သိုလှောင်မှု၏လုပ်ဆောင်မှုကိုအကောင်အထည်ဖော်ရန်တီထွင်သည်။

 <span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">DbSessionHandler</span></span><span> </span><span><span class="hljs-keyword">extends</span></span><span> </span><span><span class="hljs-title">SessionHandler</span></span><span>
{
    </span><span><span class="hljs-keyword">protected</span></span><span> </span><span><span class="hljs-variable">$db</span></span><span>;

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$db</span></span></span><span>)
    {
        </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db = </span><span><span class="hljs-variable">$db</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">open</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$savePath</span></span></span><span>, </span><span><span class="hljs-variable">$sessionName</span></span><span>)
    {
        </span><span><span class="hljs-comment">// </span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">close</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
    {
        </span><span><span class="hljs-comment">// </span></span><span>
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">read</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// </span></span><span>
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT session_data FROM sessions WHERE session_id = :session_id"</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'session_id'</span></span><span> =&gt; </span><span><span class="hljs-variable">$sessionId</span></span><span>]);
        </span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);

        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span> ? </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'session_data'</span></span><span>] : </span><span><span class="hljs-string">''</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">write</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>)
    {
        </span><span><span class="hljs-comment">// </span></span><span>
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"REPLACE INTO sessions (session_id, session_data, last_access) VALUES (:session_id, :session_data, :last_access)"</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([
            </span><span><span class="hljs-string">'session_id'</span></span><span> =&gt; </span><span><span class="hljs-variable">$sessionId</span></span><span>,
            </span><span><span class="hljs-string">'session_data'</span></span><span> =&gt; </span><span><span class="hljs-variable">$data</span></span><span>,
            </span><span><span class="hljs-string">'last_access'</span></span><span> =&gt; </span><span><span class="hljs-title function_ invoke__">time</span></span><span>()
        ]);

        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">destroy</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// </span></span><span>
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM sessions WHERE session_id = :session_id"</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'session_id'</span></span><span> =&gt; </span><span><span class="hljs-variable">$sessionId</span></span><span>]);

        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">gc</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$maxlifetime</span></span></span><span>)
    {
        </span><span><span class="hljs-comment">// </span></span><span>
        </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;db-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM sessions WHERE last_access &lt; :expire_time"</span></span><span>);
        </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'expire_time'</span></span><span> =&gt; </span><span><span class="hljs-title function_ invoke__">time</span></span><span>() - </span><span><span class="hljs-variable">$maxlifetime</span></span><span>]);

        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
    }
}
</span></span>

ဤအကောင်အထည်ဖော်မှုတွင်ကျွန်ုပ်တို့သည် PDO မှတစ်ဆင့်ဒေတာဘေ့စ်နှင့်အတူအပြန်အလှန်ဆက်သွယ်မှုနှင့်သတ်သတ်မှတ်မှတ်စစ်ဆင်ရေးများမှာအောက်ပါအတိုင်းဖြစ်သည် -

  • ပွင့်လင်းသော နည်းလမ်း - ဒေတာဘေ့စ်ဆက်သွယ်မှုကိုစတင်ပါ။ များသောအားဖြင့်ဒေတာဘေ့စ်ဆက်သွယ်မှုကိုဤနည်းလမ်းဖြင့်သတ်မှတ်ထားသည်။

  • Read Method - စာရှုထောင့်မှ Session ID မှတဆင့်ဒေတာဘေ့စ်မှအချက်အလက်များကိုမေးမြန်းပါ။

  • ရေးပါ နည်းလမ်း - ဒေတာဘေ့စ်သို့ Session data ကိုရေးပါ။ အကယ်. session ID မရှိပါကမှတ်တမ်းအသစ်တစ်ခုထည့်ပါ, လက်ရှိမှတ်တမ်းကိုမွမ်းမံပါ။

  • Destroy Method - သတ်မှတ်ထားသော session ID နှင့်ဒေတာများကိုဖျက်ပါ။

  • GC Method: အမှိုက်သရိုက်စုဆောင်းမှုစစ်ဆင်ရေးကိုလုပ်ဆောင်ပြီးသက်တမ်းကုန်ဆုံးသောအစည်းအဝေးမှတ်တမ်းများကိုဖျက်ပစ်ပါ။

အဆင့် 3. စိတ်ကြိုက် session processor ကိုမှတ်ပုံတင်ပါ

SessionHandler ကိုအကောင်အထည်ဖော်ပြီးနောက် PHP တွင်စိတ်ကြိုက် session သိုလှောင်ရေးပရိုဆက်ဆာကိုမှတ်ပုံတင်ရန်လိုအပ်သည်။ session_set_saver_handler function မှတဆင့်စိတ်ကြိုက် session processing နည်းလမ်းများကိုသတ်မှတ်ပါ။

 <span><span><span class="hljs-comment">// </span></span><span>
</span><span><span class="hljs-variable">$db</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);

</span><span><span class="hljs-comment">// </span></span><span>
</span><span><span class="hljs-variable">$sessionHandler</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DbSessionHandler</span></span><span>(</span><span><span class="hljs-variable">$db</span></span><span>);

</span><span><span class="hljs-comment">// </span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_set_save_handler</span></span><span>(
    [</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'open'</span></span><span>],
    [</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'close'</span></span><span>],
    [</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'read'</span></span><span>],
    [</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'write'</span></span><span>],
    [</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'destroy'</span></span><span>],
    [</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'gc'</span></span><span>]
);

</span><span><span class="hljs-comment">// </span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span></span>

ဤနေရာတွင် Session_set_save_Handler သည် PHP ၏ session processing method ကိုစိတ်ကြိုက် dbspirprophandler အတန်းဖြင့်အစားထိုးသည်။

3 ။ ထိရောက်သောနှင့်တည်ငြိမ်သောဒေတာဘေ့စ်အစည်းအဝေးများအောင်မြင်ရန်ဘယ်လို?

ထိရောက်သောနှင့်တည်ငြိမ်သောဒေတာဘေ့စ် session သိုလှောင်မှုကိုရရှိရန်အောက်ပါရှုထောင့်များကိုအထူးဂရုပြုသင့်သည် -

1 ။ သင့်လျော်သောအညွှန်းကိန်းကိုသုံးပါ

Session Table တွင် Session_ID field သည်များသောအားဖြင့်အဓိကသော့ချက်အဖြစ်အသုံးပြုလေ့ရှိပြီး၎င်းကိုထူးခြားမှုနှင့်ထိရောက်သောစုံစမ်းမှုစွမ်းဆောင်ရည်စွမ်းဆောင်ရည်ရှိသည်။ ထို့အပြင် Last_access Field ကိုအမှိုက်သပိတ်စုဆောင်းခြင်းတွင်သက်တမ်းကုန်ဆုံးသောအစည်းအဝေးများအားထိရောက်စွာရှာဖွေခြင်းကိုဖွင့်ရန်ညွှန်ကြားနိုင်သည်။

2 ။ သင့်လျော်သော session သက်တမ်းကုန်ဆုံးမဟာဗျူဟာ

Session သက်တမ်းကုန်ဆုံးနည်းဗျူဟာသည်ထိရောက်သောဒေတာဘေ့စ်အစည်းအဝေးများကိုသေချာစေရန်သော့ချက်ဖြစ်သည်။ By rationally setting the maximum life time of the session ( maxlifetime ) and deleting expired sessions in the gc method, you can prevent too much junk data in the database.

3 ။ session locking နှင့်တစ်ပြိုင်နက်တည်းထိန်းချုပ်မှု

အခက်အခဲဆိုင်ရာအချက်အလက်များကိုမျှဝေခြင်း, တောင်းဆိုမှုများစွာသည်တစ်ချိန်တည်းတွင်တူညီသော session ကိုရယူပြီးပြုပြင်နိုင်သည်။ အချက်အလက်ပ conflicts ိပက်ခများနှင့်ရှေ့နောက်မညီမှုများမှရှောင်ရှားရန်အခြားတောင်းဆိုမှုများကိုတစ်ပြိုင်နက်တည်းပြုပြင်မွမ်းမံခြင်းများကိုတစ်ပြိုင်နက်တည်းပြုပြင်မွမ်းမံခြင်းမပြုရန် session statey stategy ကိုလက်ခံနိုင်သည်။

4 ။ ဒေတာဘေ့စ် connection pool

မြင့်မားသောတစ်ပြိုင်နက်တည်း Applications များအတွက် database connection ကိုတိုက်ရိုက်ဖန်တီးခြင်းတစ်ခုချင်းစီကိုအချိန်ကစွမ်းဆောင်ရည်အပေါ်အကျိုးသက်ရောက်နိုင်သည်။ ဒေတာဘေ့စ် connection နည်းပညာကိုအသုံးပြုခြင်းသို့မဟုတ်ဒေတာဘေ့စ်ဆက်သွယ်မှုများကိုဆက်လက်လုပ်ဆောင်ခြင်းအားဖြင့်စွမ်းဆောင်ရည်တိုးတက်အောင်ပြုလုပ်ခြင်းကိုစဉ်းစားပါ။

5 ။ Cache နည်းပညာကိုသုံးပါ

ဒေတာဘေ့စ်ပေါ်ရှိဖိအားကိုလျှော့ချရန် Redis, MediCached Technologies များကိုပေါင်းစပ်ရန်စဉ်းစားရန်ဖြစ်နိုင်ချေရှိလျှင်ဒေတာများကိုမှတ်ဉာဏ်ထဲသို့ 0 န်ထုပ်ပါ

4 ။ အကျဉ်းချုပ်

By implementing the SessionHandler interface and storing session data in the database, the flexibility and stability of session management can be effectively improved. ဆွေးနွေးခန်းအား Session Storage ၏အကောင်အထည်ဖော်မှုနည်းလမ်းကိုဒီဇိုင်းဆွဲခြင်းဖြင့်သင့်လျော်သောအကောင်းဆုံးအစီအမံများပြုလုပ်ခြင်းဖြင့်ထိရောက်သော, တည်ငြိမ်သော Database session session system ကိုရရှိနိုင်ပါသည်။