PHP တွင် Ident_User_abort () function ကိုအသုံးပြုသည်။ သို့သော် developer တော်တော်များများက၎င်းသည်အသုံးပြုရန်အတွက်အကျိုးသက်ရောက်ခြင်းမရှိသေးကြောင်းတွေ့ရှိလိမ့်မည်။ ဤဆောင်းပါးသည်ဤပြ problem နာ၏အကြောင်းရင်းများကိုနက်နက်နဲနဲခွဲခြမ်းစိတ်ဖြာပြီးဘုံဖြေရှင်းချက်အချို့ကိုအကျဉ်းချုပ်ဖော်ပြလိမ့်မည်။
Idegal_user_abort () သည် Boolean Parameter ကိုလက်ခံသော PHP ၏ built-in function တစ်ခုဖြစ်သည်။ ဤလုပ်ဆောင်ချက်ကိုဖုန်းဆက်ပြီးနောက် PHP သည်အသုံးပြုသူအ နေ ဖြင့်အသုံးပြုသူအဆက်ပြတ်သည့်အဖြစ်အပျက်ကိုလျစ်လျူရှုပြီးတက်ကြွစွာလုပ်ဆောင်သည်အထိလက်ရှိ script ကိုဆက်လက်လုပ်ဆောင်သည်။
<?php
ignore_user_abort(true);
echo "အဆိုပါ script ကိုကွပ်မျက်စတင်သည်\n";
// အချို့သောအချိန်ကုန်စားသုံးအလုပ်များဖျော်ဖြေသည်ဟုယူဆပါ
sleep(30);
echo "script လုပ်ဆောင်မှု၏အဆုံး\n";
?>
အထက်ပါကုဒ်သည်သီအိုရီအရအသုံးပြုသူသည် browser ကိုပိတ်ထားရင်တောင်ဆက်လက်လုပ်ဆောင်ရန်လိုအပ်သည်။
PHP ၏ကွပ်မျက် mode ကိုကွဲပြားလိမ့်မည်။
CLI MODE - များသောအားဖြင့်အသုံးပြုသူအဆက်ပြတ်သောကြောင့်၎င်းသည်အဆက်ပြတ်သောကြောင့်၎င်းသည်မရပ်နိုင်ပါ။
CGI / FastCGi Mode : Web Server Configuration မှကန့်သတ်ထားနိုင်သည်။
Apache Mod_php : ယေဘူယျအားဖြင့် Iverver_user_abort ကို ထောက်ခံသည်, သို့သော်သင်က configuration ကိုအာရုံစိုက်သင့်သည်။
အကယ်. script သည် output buffer တစ်ခုရှိပါက server သည် browser ကိုအဆက်ဖြတ်ခြင်းခံရသောအခါ PHP လုပ်ငန်းစဉ်ကိုအတိအကျမတူစေရန်အချိန်နှင့်မကိုက်ညီပါ။
ဖြေရှင်းချက် - output buffer ကိုပိတ်ထားပါသို့မဟုတ် refresh လုပ်ပါ။
<?php
ignore_user_abort(true);
ob_end_flush(); // output ထုတ် buffering ပိတ်ထား
flush(); // output ကို browser မှပေးပို့ပါ
sleep(30);
?>
Maxecution_time_time တွင် PHP configuration တွင်အမြင့်ဆုံးကွပ်မျက်ချိန်ကိုကန့်သတ်ထားလိမ့်မည်။
ဖြေရှင်းချက် - Maxecution_Time_Time သို့မဟုတ်ခေါ်ဆိုမှုကိုညှိပါ
<?php
set_time_limit(0); // Script Execution Time ကန့်သတ်ချက်ကိုပယ်ဖျက်ပါ
ignore_user_abort(true);
?>
အချို့သောဝက်ဘ်ဆာဗာ (သို့) ပြောင်းပြန် proxy (Nginx ကဲ့သို့ Nginx) သည်ပြတ်တောက်မှု၏တောင်းဆိုမှုကိုနှောင့်ယှက်ခြင်း,
ဖြေရှင်းချက် -
ဆာဗာနှင့်အေးဂျင့်များအတွက်အချိန်ကုန်ချိန်ညှိချက်များကိုအတည်ပြုပါ။
ရေရှည် PHP scripts များကိုအစားထိုးရန်နှင့်နောက်ခံအရောင် daemon ကိုအသုံးပြုပါ။
<?php
ignore_user_abort(true);
echo "အလုပ်များကိုကွပ်မျက်ခြင်းစတင်ပါ\n";
sleep(30);
echo "မစ်ရှင်အဆုံးသတ်\n";
?>
အကယ်. browser ကိုအဆက်ပြတ်နေလျှင်, output ကိုချက်ချင်းမပို့နိုင်ပါ။
<?php
ignore_user_abort(true);
set_time_limit(0);
echo "အလုပ်များကိုကွပ်မျက်ခြင်းစတင်ပါ\n";
ob_end_flush();
flush();
sleep(30);
echo "မစ်ရှင်အဆုံးသတ်\n";
?>
မေးမြန်း | အဖေြ |
---|---|
အသုံးပြုသူအဆက်ဖြတ်ခြင်းကြောင့် script သည်ရပ်စဲသည် | လျစ်လျူရှုထားသည့် awig_user_abort (True) |
Script လုပ်ဆောင်မှုအချိန်ကန့်သတ်သည် | set_time_limit (0) |
output ကိုချက်ချင်းမပို့ပါ, | output ကို buffering ob_end_flush () နှင့် flush ကိုခေါ်ပါ () |
ဆာဗာအချိန်ကုန်သို့မဟုတ် proxy ကန့်သတ် | ဆာဗာ configuration ကိုညှိခြင်းနှင့်နောက်ခံအလုပ်နည်းလမ်းများကိုအသုံးပြုပါ |
အထူးသဖြင့်ရှုပ်ထွေးသောဆာဗာဝန်းကျင်တွင် imign_user_abort () သည်အထူးသဖြင့်ရှုပ်ထွေးသောဆာဗာပတ်ဝန်းကျင်တွင်ဤလုပ်ငန်းကိုခေါ်ယူခြင်းသည်ဇာတ်ညွှန်းကိုစဉ်ဆက်မပြတ်ကွပ်မျက်ခံရရန်မဖြစ်နိုင်ပါ။ ကျိုးကြောင်းဆီလျော်သော output control ကိုပေါင်းစပ်ခြင်းဖြင့်သာလုပ်ဆောင်ချက်အချိန်ချိန်ညှိချက်များနှင့်ဆာဗာဖွဲ့စည်းမှုကိုစံပြရလဒ်များကိုရရှိနိုင်သည်။ တစ်ချိန်တည်းမှာပင်ရေရှည်အလုပ်များအတွက်စနစ်တည်ငြိမ်မှုနှင့်ပမာဏကိုတိုးတက်စေရန်မက်ဆေ့ခ်ျများသို့မဟုတ်နောက်ခံ daemon ဒီဇိုင်းကိုအသုံးပြုရန်အကြံပြုသည်။
<?php
// ပုံမှန်အသုံးပြုမှုသရုပ်ပြ
ignore_user_abort(true);
set_time_limit(0);
echo "မစ်ရှင်စတင်သည်\n";
ob_end_flush();
flush();
for ($i = 0; $i < 10; $i++) {
// ရှည်လျားသောပြေးအလုပ်များပိုမိုဆင်တူသည်
sleep(3);
echo "ပစ္စည်းစာရင်း:$i\n";
flush();
}
echo "Task ပြီးစီးခြင်း\n";
?>