PHP, Socket_accept ကို အသုံးပြု. ပရိုဂရမ်းမင်းကွန်ယက်များသည် client များထံမှဆက်သွယ်မှုတောင်းဆိုမှုများကိုလက်ခံခြင်းအတွက်အရေးကြီးသောလုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ ဤလုပ်ဆောင်ချက်သည်များသောအားဖြင့် Socket-based server ကိုတည်ဆောက်ရန် Socket_create () , socket_bind () နှင့် socket_listen () နှင့် socket_listen ()) နှင့် တွဲဖက်. အသုံးပြုလေ့ရှိသည်။ သို့သော်အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုတွင် developer များသည်မတူညီသော operating systems များ, Windows နှင့် Linux တို့တွင် PHP Socket Program ကိုလုပ်ဆောင်ရန်ကြိုးစားသောအခါသဟဇာတကိစ္စများကိုကြုံတွေ့ရနိုင်သည်။ ဤဆောင်းပါးသည်ဤအလားအလာရှိသောပြ problems နာများနှင့်သူတို့၏ဖြေရှင်းချက်များကိုနက်နက်ရှိုင်းရှိုင်းလေ့လာပါလိမ့်မည်။
Socket_Accept ၏အခြေခံ function () သည် () ၏ socketed socket မှချိတ်ဆက်ထားသော socket မှဆက်သွယ်မှုကိုလက်ခံရန်ဖြစ်သည်။ ၎င်း၏ပုံမှန်အသုံးပြုမှုမှာအောက်ပါအတိုင်းဖြစ်သည် -
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 12345);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
if ($client !== false) {
socket_write($client, "Hello Client!", 12);
socket_close($client);
}
}
ဤအတိုအထွာသည်အများအားဖြင့် Linux Systems တွင်ချောချောမွေ့မွေ့လည်ပတ်နိုင်သော်လည်း Windows Systems တွင်လိုက်လျောညီထွေဖြစ်မှုဆိုင်ရာပြ issues နာအချို့ရှိနိုင်သည်။
Windows တွင် Socketets များသည်ပုံမှန်အားဖြင့်ပိတ်ဆို့ခြင်း, connection တောင်းဆိုမှုမရှိပါကအဓိကချည်နှောင်ခြင်းကိုပိတ်ဆို့ရန် socket_accept () ကို ပိတ်ဆို့ခြင်းဖြစ်နိုင်သည်။ အချို့သော Linux Systems တွင် configuration သို့မဟုတ် system ကွဲပြားခြားနားမှုများတွင်၎င်းတို့အားပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင်ပါ 0 င်စေနိုင်သည်သို့မဟုတ် PPP configurations တွင်ကွဲပြားခြားနားစွာပြုမူစေနိုင်သည်။
ဖြေရှင်းနည်း - developer များကပိတ်ဆို့ခြင်းသို့မဟုတ်ပိတ်ဆို့ခြင်းမဟုတ်သောအပြုအမူများကိုအတိအလင်းသတ်မှတ်နိုင်သည်။
socket_set_block($socket); // အတိအလင်းပိတ်ဆို့ဖို့သတ်မှတ်ထား
// သို့မဟုတ်
socket_set_nonblock($socket); // အတိအလင်းမဟုတ်သောပိတ်ဆို့ခြင်းမှသတ်မှတ်ထား
စည်းလုံးညီညွတ်ချိန်ညှိချက်များသည်ပလက်ဖောင်းကွဲပြားမှုကြောင့်ဖြစ်ပေါ်လာသောအမူအကျင့်ဆိုင်ရာရှေ့နောက်မညီမှုများမှရှောင်ရှားနိုင်သည်။
Linux System များတွင် 1024 ထက်နည်းလျှင် (443 နှစ်, 443) သည် (80, 443) ထက် နည်းလျှင်,
ဖြေရှင်းချက် - 1024 ထက်ကြီးမြတ်သော port ကိုသုံးပါ,
Linux Systems သည် IPv6 အတွက်ပိုမိုကောင်းမွန်သောအထောက်အပံ့များရှိပြီးအချို့သော Windows (အထူးသဖြင့်ဗားရှင်းအဟောင်းများ) ဗားရှင်း (အထူးသဖြင့်ဗားရှင်းများသည်) IPv6 အထောက်အပံ့ကို default configuration အောက်ရှိ IPv6 အထောက်အပံ့ကို enable လုပ်နိုင်မည်မဟုတ်ပါ။ AF_INT6 , Socket_accept ကို သုံး. socket တစ်ခုကိုဖန်တီးသည့်အခါပုံမှန်အားဖြင့်ဆက်သွယ်မှုကိုလက်မခံနိုင်ပါ။
Solution: AF_inet (IPv4) ကိုထိန်းသိမ်းရန်သို့မဟုတ် dvatess system support ကိုရှာဖွေတွေ့ရှိပြီးနောက်သို့မဟုတ် dynamically family ကို select လုပ်ပါ။
Windows တွင် PHP တွင် PHP ဗားရှင်းအချို့တွင် socket_accept () မအောင်မြင်ပါကသတိပေးခြင်းမရှိဘဲ မှားယွင်းစွာ ပြန်ပို့နိုင်သည်။ ဤကွာခြားချက်သည် develers များကို debugging လုပ်သည့်အခါပြ problems နာများကိုရှာဖွေရန်ခက်ခဲစေနိုင်သည်။
အကြံပြုချက် - Socket_last_Error () နှင့် Socket_StError () နှင့် Socket_StError () နှင့် socket_struror () နှင့် socket_struror () ကို သုံးပါ။
if (($client = socket_accept($socket)) === false) {
echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket));
}
Linux တွင် descript ည့်သည်များအရေအတွက်သည် 0 င်းဒိုးစနစ်များ (များသောအားဖြင့် 64, 256) တွင် defice socket connections အရေအတွက်ထက်များစွာပိုမိုမြင့်မားနိုင်သည်။ ၎င်းသည် 0 င်းဒိုးစနစ်များ () 0 င်းဒိုးစနစ်များတွင် connection times အသစ်များအားတစ်ပြိုင်နက်တည်းဆက်သွယ်မှုများချိတ်ဆက်သောအခါဆက်သွယ်မှုတောင်းဆိုမှုများကိုအချိန်မီတုံ့ပြန်ရန်ပျက်ကွက်စေနိုင်သည်။
ဖြေရှင်းချက် - တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်တည်းပတ်ဝန်းကျင်မှာပရော်ဖက်ရှင်နယ် extiences တွေကို (သို့) ပလက်ဖောင်းတွေ (SWoole-based server တွေလိုပဲ) ကိုသုံးဖို့ဒါမှမဟုတ် Windows Systems မှခွင့်ပြုခဲ့တဲ့ socket အရေအတွက်ကိုတိုးမြှင့်ဖို့အကြံပြုထားပါတယ်။
Cross-platform ပတ် 0 န်းကျင်တွင် Socket Service Programs များကို debugging process program များကိုလွယ်ကူချောမွေ့စေရန်အောက်ပါနည်းဗျူဟာများကိုအသုံးပြုရန်အကြံပြုသည်။
ရှင်းရှင်းလင်းလင်းပိတ်ဆို့ခြင်း mode ကိုသတ်မှတ်;
အဓိက socket function ကိုခေါ်ပြီးနောက်အမှားအယွင်းကိုစစ်ဆေးပါ။
Cross-platform ချထားရန်အတွက်စည်းလုံးညီညွတ်သောအပြုအမူများကိုသေချာစေရန် Unified configuration test script များကိုသုံးပါ။
ဆက်သွယ်မှုကိုအတည်ပြုရန်ကူညီရန် Telnet , NC သို့မဟုတ် Wireshark ကဲ့သို့သောကွန်ရက်ကိရိယာများကိုသုံးပါ။
troubleshooting ကိုလွယ်ကူချောမွေ့စေရန် Socket ၏ status ပြောင်းလဲမှုများကို application layer တွင်မှတ်တမ်းတင်ပါ။
PHP မှပေးသော Socket extension သည်လုပ်ဆောင်နိုင်မှုအတွက်အတော်လေးရိုးရှင်းသော်လည်း Cross-platform run သောအခါ Sockets အတွက်ကွဲပြားခြားနားမှုများအကြောင်းအာရုံစိုက်ရန်လိုအပ်နေဆဲဖြစ်သည်။ ဤဆောင်းပါးတွင်ဆန်းစစ်ထားသောဘုံပြ problems နာများနှင့်တုန့်ပြန်မှုနည်းလမ်းများစွာမှတစ်ဆင့် developer များသည် Windows နှင့် Linux တို့နှင့်လိုက်ဖက်သော socient socket service progress များကိုပိုမိုယုံကြည်စိတ်ချနိုင်သည်။ ထုတ်လုပ်မှုပတ် 0 န်းကျင်များတွင်သင်ပိုမိုမြင့်မားသောစွမ်းဆောင်ရည်နှင့်လိုက်ဖက်မှုလိုအပ်ပါက Phoole နှင့် Workermaner တို့ကဲ့သို့သောစွမ်းဆောင်ရည်မြင့်မားသော PHP-bocky formeworks များကိုလည်း အသုံးပြု. Cross-platures ပံ့ပိုးမှုဆိုင်ရာအထောက်အပံ့များရှိသော SWoole နှင့် Workermaner တို့ကဲ့သို့သောမြင့်မားသော PHPOOLS နှင့် Workermaner တို့တွင်လည်းစဉ်းစားနိုင်သည်။
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
socket_set_block($socket);
while (true) {
$client = socket_accept($socket);
if ($client !== false) {
$response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nWelcome to m66.net!";
socket_write($client, $response, strlen($response));
socket_close($client);
}
}