မျက်မှောက်ခေတ် Web Development တွင် PHP ၏ Session စီမံခန့်ခွဲမှုသည်အသုံးပြုသူများအခြေအနေကိုထိန်းသိမ်းရန်နှင့်မတူညီသောစာမျက်နှာတောင်းဆိုမှုများအကြားအသုံးပြုသူအချက်အလက်များကိုသိမ်းဆည်းထားသည့်အတွက် PHP ၏ Session စီမံခန့်ခွဲမှုသည်အဓိကအစိတ်အပိုင်းဖြစ်သည်။ ရိုးရာ session သိုလှောင်မှုနည်းလမ်းများသည်ဖိုင်စနစ်များပေါ်တွင်အခြေခံသည်။ ထို့ကြောင့် Session Information ကိုသိုလှောင်ရန်ဒေတာဘေ့စ်များကိုအသုံးပြုခြင်းသည်တဖြည်းဖြည်းဘုံအလေ့အကျင့်တစ်ခုဖြစ်လာသည်။
PHP တွင် Sessionhandler အတန်းသည် developer များအား storage storage method များကိုစိတ်ကြိုက်ပြုလုပ်ရန်ခွင့်ပြုသည့်ယန္တရားကိုပေးသည်။ sessionhandler interface ကိုအကောင်အထည်ဖော်ခြင်းအားဖြင့်အစည်းအဝေးများကိုဒေတာဘေ့စ်တွင်သိမ်းဆည်းထားနိုင်သည်။
ဤဆောင်းပါးသည် SessionHandler မှတဆင့် session ကိုမည်သို့အကောင်အထည်ဖော်ရမည်ကိုဆွေးနွေးပါမည်။ : Database နှင့်အတူဖွင့်ပြီး ထိရောက်သောတည်ငြိမ်သောဒေတာဘေ့စ်အစည်းအဝေးစနစ်ကိုမည်သို့အကောင်အထည်ဖော်ရမည်ကိုဆွေးနွေးပါမည်။
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 တစ်ခုသို့သိမ်းဆည်းနိုင်သည်။
အောက်ဖော်ပြပါဒေတာဘေ့စ်တွင် session data တွင် session data တွင်သိမ်းဆည်းရန်အခြေခံအဆင့်များဖြစ်သည်။
ပထမ ဦး စွာသင်ခန်းစာအချက်အလက်များကိုသိမ်းဆည်းရန်ဒေတာဘေ့စ်တွင်ဇယားတစ်ခုဖန်တီးရန်လိုအပ်သည်။ ဇယားဖွဲ့စည်းပုံ၏အခြေခံဥပမာမှာ -
<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 ကိုအသုံးပြုသည်။
ထို့နောက် 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>->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>->db-></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>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'session_id'</span></span><span> => </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>-></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>->db-></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>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([
</span><span><span class="hljs-string">'session_id'</span></span><span> => </span><span><span class="hljs-variable">$sessionId</span></span><span>,
</span><span><span class="hljs-string">'session_data'</span></span><span> => </span><span><span class="hljs-variable">$data</span></span><span>,
</span><span><span class="hljs-string">'last_access'</span></span><span> => </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>->db-></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>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'session_id'</span></span><span> => </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>->db-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM sessions WHERE last_access < :expire_time"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'expire_time'</span></span><span> => </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: အမှိုက်သရိုက်စုဆောင်းမှုစစ်ဆင်ရေးကိုလုပ်ဆောင်ပြီးသက်တမ်းကုန်ဆုံးသောအစည်းအဝေးမှတ်တမ်းများကိုဖျက်ပစ်ပါ။
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 အတန်းဖြင့်အစားထိုးသည်။
ထိရောက်သောနှင့်တည်ငြိမ်သောဒေတာဘေ့စ် session သိုလှောင်မှုကိုရရှိရန်အောက်ပါရှုထောင့်များကိုအထူးဂရုပြုသင့်သည် -
Session Table တွင် Session_ID field သည်များသောအားဖြင့်အဓိကသော့ချက်အဖြစ်အသုံးပြုလေ့ရှိပြီး၎င်းကိုထူးခြားမှုနှင့်ထိရောက်သောစုံစမ်းမှုစွမ်းဆောင်ရည်စွမ်းဆောင်ရည်ရှိသည်။ ထို့အပြင် Last_access Field ကိုအမှိုက်သပိတ်စုဆောင်းခြင်းတွင်သက်တမ်းကုန်ဆုံးသောအစည်းအဝေးများအားထိရောက်စွာရှာဖွေခြင်းကိုဖွင့်ရန်ညွှန်ကြားနိုင်သည်။
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.
အခက်အခဲဆိုင်ရာအချက်အလက်များကိုမျှဝေခြင်း, တောင်းဆိုမှုများစွာသည်တစ်ချိန်တည်းတွင်တူညီသော session ကိုရယူပြီးပြုပြင်နိုင်သည်။ အချက်အလက်ပ conflicts ိပက်ခများနှင့်ရှေ့နောက်မညီမှုများမှရှောင်ရှားရန်အခြားတောင်းဆိုမှုများကိုတစ်ပြိုင်နက်တည်းပြုပြင်မွမ်းမံခြင်းများကိုတစ်ပြိုင်နက်တည်းပြုပြင်မွမ်းမံခြင်းမပြုရန် session statey stategy ကိုလက်ခံနိုင်သည်။
မြင့်မားသောတစ်ပြိုင်နက်တည်း Applications များအတွက် database connection ကိုတိုက်ရိုက်ဖန်တီးခြင်းတစ်ခုချင်းစီကိုအချိန်ကစွမ်းဆောင်ရည်အပေါ်အကျိုးသက်ရောက်နိုင်သည်။ ဒေတာဘေ့စ် connection နည်းပညာကိုအသုံးပြုခြင်းသို့မဟုတ်ဒေတာဘေ့စ်ဆက်သွယ်မှုများကိုဆက်လက်လုပ်ဆောင်ခြင်းအားဖြင့်စွမ်းဆောင်ရည်တိုးတက်အောင်ပြုလုပ်ခြင်းကိုစဉ်းစားပါ။
ဒေတာဘေ့စ်ပေါ်ရှိဖိအားကိုလျှော့ချရန် Redis, MediCached Technologies များကိုပေါင်းစပ်ရန်စဉ်းစားရန်ဖြစ်နိုင်ချေရှိလျှင်ဒေတာများကိုမှတ်ဉာဏ်ထဲသို့ 0 န်ထုပ်ပါ
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 ကိုရရှိနိုင်ပါသည်။