PHP ကိုအသုံးပြုခြင်းသို့မဟုတ်စွမ်းဆောင်ရည်မြင့်မားသော PHP applications များကိုရေးဆွဲရန် PHP ကိုအသုံးပြုသောအခါ developer များစွာသည် Thread ဘေးကင်းလုံခြုံမှု (TS) ပြ problems နာများကြုံတွေ့ရလိမ့်မည်။ အထူးသဖြင့် PHP (Apache mod_php ကဲ့သို့သောအထူးပတ် 0 န်းကျင်ရှိအချို့သောအထူးပတ်ဝန်းကျင်တွင်အချို့သောအထူး ပတ်ဝန်းကျင်ရှိ PHP ZTS ကဲ့သို့သော PHP ZTS ကဲ့သို့သော PHP ZTS ကဲ့သို့သော PHP ZTS ကဲ့သို့သော PHP zts ကဲ့သို့) တွင်စာဖြင့်ရေးဆွဲခြင်း,
ဤဆောင်းပါးသည်ဤ ပြ problems နာများကိုမည်သို့ခွဲခြားသိမြင်နိုင်မည်ကိုအသေးစိတ်ရှင်းပြပါမည်။
Thread ဘေးကင်းလုံခြုံမှုကိုရည်ညွှန်းသည် - ချည်မျှင်ပေါင်းများစွာသည်တူညီသော code တစ်ခုနှင့်တူညီသောကုဒ်ကို 0 င်ရောက်သောအခါကုဒ်သည်အချက်အလက်များ၏မှန်ကန်မှုနှင့်ကိုက်ညီမှုကိုသေချာစေပြီးပြိုင်ပွဲအခြေအနေများသို့မဟုတ်ဒေတာအကျင့်ပျက်ခြစားမှုများဖြစ်စေနိုင်သည်။
PHP တွင် scripts အများစု (FPM Mode ကဲ့သို့) တစ် ဦး (FPM mode ကဲ့သို့) တစ် ဦး တည်းသောချည် (ထိုကဲ့သို့သော FPM mode) တွင် run ပေမယ့်သင် PHM extensions သို့မဟုတ်အလုပ် zts mode မှာရေးပါက static variable တွေကို, shared variable များစသဖြင့်
ပုံမှန် init function တွင်ပါဝင်နိုင်သည်။
static variable ကို variable ကိုစတင်
singleton အရာဝတ်ထုဖန်တီးမှု
Connection Pools နှင့် cache pools များကိုစတင်ခြင်း
ကမ္ဘာလုံးဆိုင်ရာအရင်းအမြစ်များကိုခွဲဝေချထားပေးခြင်း
ဥပမာအားဖြင့်:
function init() {
static $initialized = false;
if (!$initialized) {
// တစ်ကြိမ်ကန ဦး ဆိုင်ရာယုတ္တိဗေဒ Execute လုပ်ပါ
setup_connection('https://gitbox.net/api/setup');
$initialized = true;
}
}
တစ် ဦး တည်းသောချည်တွင်ထိုကဲ့သို့သောကုဒ်နှင့်အတူပြ problem နာမရှိပါ။ သို့သော် multi-ည့်သည်များအရ Threads မျိုးစုံတွင်တစ်ချိန်တည်းတွင် Inits ထည့်သွင်းပါက $ Initialized Multies သည် မှားယွင်းစွာ ဖော်ထုတ်နိုင်ပြီး,
တိုက်ရိုက်နည်းလမ်းမှာတစ်ချိန်တည်းတွင်တစ်ချိန်တည်းတွင်သာလုပ်ဆောင်နိုင်ရန်အတွက် Initialization Layer ၏အပြင်ဘက်အလွှာကိုသော့ခတ်ရန်ဖြစ်သည်။
$lock = fopen('/tmp/init.lock', 'c');
function init() {
global $lock;
static $initialized = false;
if (!$initialized) {
flock($lock, LOCK_EX);
if (!$initialized) {
setup_connection('https://gitbox.net/api/setup');
$initialized = true;
}
flock($lock, LOCK_UN);
}
}
ဤနည်းလမ်းသည်ရိုးရိုးရှင်းရှင်းနှင့်ထိရောက်မှုရှိသော်လည်းဖိုင်သော့ခတ်ခြင်းနှင့်ဖြစ်နိုင်ချေပိတ်ဆို့ခြင်းကိုအာရုံစိုက်ပါ။
အကယ်. သင်သည် PHP extensions များကိုရေးသားနေပါက PHP သည် TSRM (Thread Safe Resource Manager Manager) ယန္တရားကိုထောက်ပံ့ပေးသည်။
ဥပမာအားဖြင့်:
#ifdef ZTS
void ***tsrm_ls = NULL;
#endif
PHP_FUNCTION(init) {
// အသုံးပြု TSRMLS ဒေသခံချည်သိုလှောင်မှုရယူပါ
}
သို့သော်၎င်းသည် C-level အကောင်အထည်ဖော်မှုနှင့်သက်ဆိုင်ပြီး PHP kernel ကိုနားလည်ရန်လိုအပ်သည်။
ဖြစ်နိုင်လျှင် Init function ကိုဘေးထွက်ဆိုးကျိုးများကင်းဝေးစေရန်ကြိုးစားပါ။
ကမ္ဘာလုံးဆိုင်ရာသို့မဟုတ်ငြိမ် variable တွေကိုမပြုပြင်ပါနှင့်။
မျှဝေထားသောအရင်းအမြစ်များကိုမှီခိုခြင်းမရှိပါ။
တစ်ခုချင်းစီကိုချည်တစ်ခုချင်းစီကိုတစ် ဦး တည်းလွတ်လပ်စွာဆက်စပ်။
ဤဒီဇိုင်းသည်ပြန်လည်တည်ဆောက်ရန်လိုအပ်သော်လည်းအခြေခံကျသောဖြေရှင်းနည်းဖြစ်သည်။
PHP ရှိ Init functions များ၏ချည်၏လုံခြုံမှုပြ problem နာကိုဖြေရှင်းရန်သင်လိုအပ်သည် -
? တည်ငြိမ်သော variable တွေကိုနှင့်ကမ္ဘာလုံးဆိုင်ရာပြည်နယ်များကိုခွဲခြားသတ်မှတ်;
? အဓိကအစိတ်အပိုင်းများကိုကာကွယ်ရန်သော့ခတ်ယန္တရားကိုသုံးပါ။
? extensions အတွက်ချည်ပေါင်းစည်းမှုအတွက် TSRM ကိုသုံးပါ။
? ဒီဇိုင်းရေးဆွဲသည့်အခါမျှဝေခြင်းကိုရှောင်ရှားရန်ကြိုးစားပါ။
၎င်းသည်သင်၏ code သည်ကြီးမားသော bug များမပါဘဲပတ် 0 န်းကျင်တွင်တည်ငြိမ်အေးချမ်းသည့်ပတ်ဝန်းကျင်တွင်တည်ငြိမ်ပြီးယုံကြည်စိတ်ချရကြောင်းသေချာစေလိမ့်မည်။
အကယ်. သင့်တွင်တိကျသောတိုးချဲ့မှုဖွံ့ဖြိုးတိုးတက်မှုဆိုင်ရာလိုအပ်ချက်များသို့မဟုတ်ချည်မျှင်ဘေးကင်းလုံခြုံရေးဆိုင်ရာမေးခွန်းများရှိပါက Https:/gitbox.net/php-Ts-s-Guide သို့သင်ပိုမိုအသေးစိတ်ကျသောဖွံ့ဖြိုးတိုးတက်မှုလက်စွဲကိုကြည့်ရှုရန်။