PHP ၏ဖွံ့ဖြိုးတိုးတက်မှုကာလအတွင်း thread_safe နှင့် session_start () ကိုအသုံးပြုခြင်းကို developer များကမကြာခဏဖော်ပြလေ့ရှိသည်။ Thread_safe ဆိုသည်မှာ PHP သည် Thread-Safe Mode တွင်အလုပ်လုပ်သည် ။ သင်နှစ်ခုလုံးကိုသုံးပါကပ conflict ိပက်ခရှိလိမ့်မည်နည်း။ ပ conflict ိပက်ခတစ်ခုရှိလျှင်၎င်းကိုမည်သို့ကိုင်တွယ်ဖြေရှင်းရမည်နည်း။ ဤဆောင်းပါးသည်သင့်အားဤပြ issue နာကိုအတူတကွဆွေးနွေးရန်သင့်အားယူပါလိမ့်မည်။
PHP သည် Thread-Safe Mode (Ts) နှင့် Non-Thread Safe Mode (Non-Thread Safe Mode) ကိုထောက်ပံ့သည်။ TS Mode တွင် PHP သည် 0 င်ရောက်နေသောပတ်ဝန်းကျင်တွင်ပတ် 0 န်းကျင်တွင်အလုပ်လုပ်သည်။ Threads မျိုးစုံအကြားလုံခြုံရေးကိုသေချာစေရန် PHP သည်ဒေတာပြိုင်ဆိုင်မှုကိုရှောင်ရှားရန် PHP သည် ts mode တွင် ts mode တွင်အသုံးပြုသည်။
NTS Mode တွင် PHP သည်ချည်မျှင်ဘေးကင်းလုံခြုံရေးပြ issues နာများကိုစဉ်းစားရန်မလိုအပ်ပါ,
Session_Start () သည် session တစ်ခုစတင်ရန်နှင့် session ID တစ်ခုဖန်တီးရန် PHP အသုံးပြုမှုအသုံးပြုမှုတစ်ခုဖြစ်သည်။ အသုံးပြုသူသည် session တစ်ခုရှိပြီးသားဟုတ်မဟုတ်စစ်ဆေးသည်။ မပါလျှင်အသစ်တစ်ခုကို session တစ်ခုဖန်တီးသည်။ Session Data ကိုများသောအားဖြင့်ဆာဗာဘက်တွင်သိမ်းဆည်းထားလေ့ရှိပြီးအသုံးပြုသူဘေးသည် browser ၏ cookie မှတဆင့် session id ကိုသိမ်းဆည်းထားသည်။ PHP သည်ဤ ID ကိုတောင်းဆိုသည့်အခါတိုင်းဤ ID ကိုရယူနိုင်သည်။
ပုံမှန်အားဖြင့် session_start () session ကိုသတင်းအချက်အလက်များကိုသိုလှောင်ထားသောဖိုင်တစ်ခုမှ session တစ်ခုမှအချက်အလက်များကိုတင်ရန်ကြိုးစားသည်။ ဤအမူအကျင့်တွင်တစ်ပြိုင်နက်တည်းဝင်ရောက်နိုင်သည့်အခါတောင်းဆိုမှုများအမြောက်အများအကြားဒေတာများအကြားဒေတာများအနှောင့်အယှက်မဖြစ်ရန်သေချာစေရန်ဤအပြုအမူတွင်ဖိုင်မှတ်တမ်းများ (ဖိုင်စနစ်၌ပင်) ဖိုင်သော့ခတ်ခြင်းများပါ 0 င်သည်။
PHP သည် Thread_Safe mode တွင် run သောအခါ Thread ဘေးကင်းလုံခြုံမှုယန္တရားကိုဖွင့်ထားပြီး PHP ကို php ပေါင်းစုံသောဆာဗာပတ်ဝန်းကျင်တွင်ဝင်ရောက်ခွင့်ပြုသည်။ သို့သော်ဤ multxeaded mode တွင် PHP session စီမံခန့်ခွဲမှု ( session_start) ) တွင်အထူးသဖြင့်မျှဝေထားသောမှတ်ဉာဏ်နှင့်ဖိုင်သော့ခတ်ခြင်းများကိုစီမံခန့်ခွဲခြင်းတွင်ပြ questions နာအချို့ကိုကြုံတွေ့ရနိုင်သည်။
PHP ၏ thread_safe mode တွင် Threads မျိုးစုံအကြား Session စီမံခန့်ခွဲမှုသည်ပြိုင်ပွဲအခြေအနေများကြုံတွေ့ရနိုင်သည်။ ဥပမာအားဖြင့် PHP သည် session data ဖိုင်များကိုတစ်ပြိုင်နက်တည်းဖတ်ရန်သို့မဟုတ်ရေးရန်ကြိုးစားသည်ဆိုပါကသော့ခတ်ယန္တရားကိုမှန်ကန်စွာထပ်တူပြုခြင်းမပြုနိုင်ပါ။
ဤပ conflict ိပက်ခကိုအဓိကအားဖြင့်အောက်ပါရှုထောင့်များတွင်ဖော်ပြထားသည်။
Lock ယန္တရားပ conflict ိပက်ခ - ချည်နှောင်ထားသည့်အရာသည် Thread-Safe Mode သည် Threads များအကြားသော့ခတ်ရေးစနစ်ပေါ်တွင်မူတည်သည် ။ PHP တွင်သော့ခတ်ခြင်းယန္တရားများနှင့်ပ conflict ိပက်ခပြုလုပ်နိုင်သည်။
Performance Bottleneck : မြင့်မားသောတစ်ပြိုင်နက်တည်းပတ်ဝန်းကျင်တွင် session_start () သည် thread synchronization နှင့်အပြန်အလှန်ဖယ်ထုတ်ခြင်းများကြောင့်စွမ်းဆောင်ရည်ပျက်စီးခြင်းကိုဖြစ်ပေါ်စေနိုင်သည်။
Session ပျောက်ဆုံးခြင်းသို့မဟုတ်ရှုပ်ထွေးခြင်း - ချည်မျှင်ပေါင်းများစွာတွင်တူညီသော session တစ်ခုသို့ 0 င်ရောက်သည့်အခါ session data များဆုံးရှုံးသွားနိုင်သည်။
Thread_safe နှင့် session_start () ပ conflict ိပက်ခများရှိနိုင်သည့်အတွက်ဤပြ problem နာကိုမည်သို့ဖြေရှင်းရမည်နည်း။ ဤတွင်ကိုင်တွယ်ရသည့်ဘုံနည်းလမ်းအနည်းငယ်ကိုဤတွင်ဖော်ပြထားသည်။
အလွယ်ကူဆုံးနှင့်ရိုးရှင်းဆုံးနည်းလမ်းမှာ PHP ကို Non-Thread Safe Mode သို့ configure လုပ်ရန်ဖြစ်သည်။ ဤနည်းအားဖြင့် PHP သည် session_start () နှင့်ချည်မျှင်လုံခြုံရေးယန္တရားအကြားပ conflict ိပက်ခကိုရှောင်ရှားသောအခါ PHP သည် Thread ဘေးကင်းလုံခြုံမှုဆိုင်ရာပြ issues နာများကိုစဉ်းစားရန်မလိုအပ်တော့ပါ။
Non-Thread Safe Mode သို့ပြောင်းရန်နည်းလမ်းမှာအောက်ပါအတိုင်းဖြစ်သည် -
PHP ဗားရှင်းကိုအသုံးပြုကြောင်းအတည်ပြုပါ။
အကယ်. သင်သည် Apache (သို့) Nginx ကိုဝက်ဘ်ဆာဗာတစ်ခုအနေဖြင့်အသုံးပြုနေပါက PHP-FPM သို့မဟုတ် Apache ပြုပြင်ခြင်းနည်းလမ်းသည် Thread Non-Thread Safe Mode တွင်သေချာအောင်လုပ်ပါ။
setting အသစ်များအကျိုးသက်ရောက်မှုကိုသေချာစေရန်ဆာဗာကို restart လုပ်ပါ။
ဤနည်းအားဖြင့် PHP သည် Inter-process ဆက်သွယ်ရေးနည်းလမ်းကိုအသုံးပြုသည်။
အကယ်. သင်သည် Threaded Non-Safe Mode သို့မပြောင်းနိုင်ပါကသို့မဟုတ်စွမ်းဆောင်ရည်ကဲ့သို့သောအခြားအကြောင်းပြချက်များကြောင့် Thread-Safe Mode ကိုအသုံးပြုရန်လိုအပ်နေသေးသည်။ ဥပမာအားဖြင့်, ရိုးရာဖိုင်သိုလှောင်မှု session အစား database သိုလှောင်မှု session တစ်ခု သို့မဟုတ် redis cache ကို သုံးပါ။
Redis သည်စွမ်းဆောင်ရည်မြင့်မားသောမှတ်ဉာဏ်သိုလှောင်မှုစနစ်ဖြစ်ပြီး Multi-Threaded Access ကိုထောက်ပံ့ပေးပြီး session data ကိုထိရောက်စွာလုပ်ဆောင်နိုင်သည့်အဆင့်မြင့်ခြင်း။ Session Data ကိုသိမ်းဆည်းရန် PHP ကိုအသုံးပြုရန် PHP ကိုပြင်ဆင်ခြင်းအားဖြင့်ဖိုင်သော့ခလောက်များအတွက်ပြိုင်ဆိုင်မှုကိုသင်ရှောင်ရှားနိုင်သည်။
ဒေတာဘေ့စ်များသည် အစည်းအဝေးများသိုလှောင်ရန်အလေ့အကျင့်တစ်ခုဖြစ်ပြီးအထူးသဖြင့် session data pervers များအနှံ့အပြားတွင် session များကိုမျှဝေရန်လိုအပ်သည်။ ဒေတာဘေ့စသိုလှောင်မှုအစည်းအဝေးများအသုံးပြုခြင်းသည်ဖိုင်သော့ခတ်ပြ problems နာများကိုရှောင်ရှားနိုင်ပြီးပိုမိုပြောင်းလွယ်ပြင်လွယ်အချက်အလက်စီမံခန့်ခွဲမှုနည်းလမ်းများပေးနိုင်သည်။
စတိုးဆိုင်များစတိုးဆိုင်များသို့ redis ကိုအသုံးပြုရန်အောက်ပါကုဒ်များဖြင့်၎င်းတို့ကို configure လုပ်နိုင်သည်။
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379');
session_start();
အကယ်. သင်သည်ဖိုင်စနစ်ကို Session Storage Method တစ်ခုအဖြစ်ဆက်လက်အသုံးပြုရမည်ဆိုပါကအခြားဖြေရှင်းနည်းတစ်ခုမှာဖိုင်သော့ခတ်ခြင်းများအသုံးပြုခြင်းကိုပိုမိုကောင်းမွန်စေရန်ဖြစ်သည်။ ဖိုင်သော့ခတ်ခြင်းများကိုတိုးမြှင့်ခြင်းသို့မဟုတ် session file များ၏သိုလှောင်မှုလမ်းကြောင်းကိုပိုမိုကောင်းမွန်စေရန် ( သို့ ) session file pathing path ကို optimize လုပ်ခြင်းဖြင့်ဖိုင်သော့ခတ်ခြင်းများကိုအငြင်းပွားမှုလျှော့ချနိုင်သည်။
အောက်ပါ configurations များကိုပြောင်းလဲခြင်းဖြင့်သင်သည်သော့ခတ်ပြိုင်ပွဲ၏အကျိုးသက်ရောက်မှုကိုလျော့ပါးစေနိုင်သည်။
session.save_path = "/path/to/session/directory"
session.gc_probability = 1
session.gc_divisor = 1000
နောက်ထပ်လှည့်ကွက်တစ်ခုမှာ session _write_close () function ကိုတတ်နိုင်သမျှအမြန်ဆုံးခေါ်ယူရန်ဖြစ်သည်။ Session Data ကိုစာချိတင်ခြင်းသည်အခြားတောင်းဆိုမှုများကိုပိုမိုမြန်ဆန်စွာရယူရန်ခွင့်ပြုသည်နှင့်ချက်ချင်းသော့ခတ်သည်။
session_start();
// လုပ်ငန်းစဉ် session ကိုဒေတာ
session_write_close();
ဤနည်းအားဖြင့်ပေါင်းစုံသောဝန်းကျင်၌ပင်ပတ် 0 န်းကျင်တွင်ပင် session file locks များကိုအချိန်ကြာမြင့်စွာကိုင်ဆောင်ထားခြင်းမှရှောင်ရှားနိုင်ပြီးသော့ခတ်ပြိုင်ပွဲ၏ဖြစ်နိုင်ခြေကိုလျော့နည်းစေသည်။
PHP သည် thread_safe mode တွင်လည်ပတ်နေသည့်အခါ၎င်းသည် session_start () နှင့်အမှန်တကယ်ပ conflict ိပက်ခဖြစ်လိမ့်မည်။ တိုက်ရိုက်ဖြေရှင်းနည်းမှာ PHP ကို Non-Threaded Safe Mode သို့ပြောင်းရန်ဖြစ်သည်။ အကယ်. အကြောင်းပြချက်အချို့ကြောင့် NTS သို့မပြောင်းနိုင်ပါက Redis (သို့) ဒေတာဘေ့စသိုလှောင်မှုအစည်းအဝေးများကိုအသုံးပြုခြင်းသို့မဟုတ်ဖိုင်သော့ခတ်ခြင်းများအသုံးပြုခြင်းကိုပိုမိုကောင်းမွန်အောင်စဉ်းစားပါ။ နည်းလမ်းတစ်ခုစီတွင်၎င်း၏သက်ဆိုင်သည့်အခြေအနေများရှိပြီးမှန်ကန်သောဖြေရှင်းချက်ကိုရွေးချယ်ခြင်းသည်ထိုကဲ့သို့သောပ conflicts ိပက်ခများကိုဖြေရှင်းရန်ကူညီနိုင်သည်။