PHP တွင်ကွန်ယက်ပရိုဂရမ်အတွက် Sockameets အတွက် sockameets ကို အသုံးပြုသောအခါပိတ်ဆို့ခြင်းမဟုတ်သောစနစ်သည်တစ်ပြိုင်နက်တည်းလုပ်ဆောင်နိုင်စွမ်းကိုတိုးတက်ကောင်းမွန်စေပြီးဖြစ်ရပ်မှန်မောင်းနှင်မှုသို့မဟုတ်မြှင့်တင်ထားသောဆာဗာများကိုအကောင်အထည်ဖော်ရန်သော့ချက်ဖြစ်သည်။ သို့သော်တစ်ခါတစ်ရံတွင်ကျွန်ုပ်တို့သည်အချို့သောနယ်မြေကိုပိတ်ဆို့ရန် socket ကိုခေတ္တရပ်ဆိုင်းထားရန် Socket ကိုခေတ္တရပ်ဆိုင်းထားရန်လိုအပ်သည်။
ကံကောင်းထောက်မစွာပင် PHP သည် fockset_set_block () နှင့် socket_set_set_set_set_set_set_nonblock ()) ကိုထောက်ပံ့ပေးသည်။
ဤဆောင်းပါးသည် TCP ဆာဗာပုံနမူနာကိုပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမရှိသောအခြေအနေကိုပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမရှိသောအခြေအနေကိုပိတ်ဆို့ခြင်းနှင့်ပြန်လည်ထူထောင်ခြင်းမပြုပါနှင့်။
ကျွန်ုပ်တို့သည်ပိတ်ဆို့ခြင်းမဟုတ်သော TCP server ကိုကျွန်ုပ်တို့တည်ဆောက်သည်။ client connection ကိုနားထောင်ပြီး client connection ကို blocking mode သို့ 0 င်ရောက်ခြင်းကိုယာယီဖွင့်ပြီးပြီးစီးပြီးနောက်ပိတ်ဆို့ခြင်းမရှိသော mode ကိုဖတ်ပါ။
ဤတွင်ပြီးပြည့်စုံသောကုဒ်ဖြစ်သည်။
<Code> <? PHP $ host = '0.0.0.0';
$ port = 12345;
// Socket ကိုဖန်တီးပါ
$ server = Socket_create (AF_INT, sock_stream, sol_tcp);
Socket_set_option ($ server, sol_socket, so_reuseaddr, 1);
// binding နှင့်နားထောင်ခြင်း
Socket_bind ($ server, $ host, $ port);
Socket_listen ($ ဆာဗာ);
// Non- ပိတ်ဆို့ခြင်းမှသတ်မှတ်ထား
Socket_set_nonBlock ($ ဆာဗာ);
ECHO "ဆာဗာကို {$ host}: {$ host}: {$ port} ... \ n";
$ client များ = [];
နေစဉ် (စစ်မှန်တဲ့) {
// connection ကိုလက်ခံခြင်း (ပိတ်ဆို့ခြင်းမဟုတ်)
$ client = @socket_acceCcept ($ ဆာဗာ);
လျှင် ($ client! == fiss) လျှင်
ECHO "client အသစ်ချိတ်ဆက်ထားသည်။ \ n";
// client ကိုစာရင်းထဲသို့ထည့်ပါ
$ client များ [] = $ client;
// client ကိုပိတ်ဆို့ခြင်းမှ client ကိုသတ်မှတ်ပါ
socket_set_nonblock($client);
}
foreach ($clients as $index => $sock) {
$buffer = '';
// အပြည့်အဝဖတ်ရန်သေချာစေရန်ပိတ်ဆို့ရန်ယာယီ(ဥပမာအားဖြင့်, သတ်မှတ်ထားသောအရှည်အရှည်သို့မဟုတ်အလံတစ်အလွှာကိုဖတ်ပါ)
socket_set_block($sock);
$bytes = @socket_recv($sock, $buffer, 1024, MSG_DONTWAIT);
// Non- ပိတ်ဆို့ခြင်းမှပြန်ပြောင်း
socket_set_nonblock($sock);
if ($bytes === false || $bytes === 0) {
// client ကိုအဆက်ပြတ်
echo "Client disconnected.\n";
socket_close($sock);
unset($clients[$index]);
continue;
}
// output ကိုဒေတာကိုဖတ်ပါ
echo "Received: " . trim($buffer) . "\n";
// နမူနာတုံ့ပြန်မှု
$response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from server!\n";
socket_write($sock, $response);
}
// အနည်းငယ်နှောင့်နှေးရှောင်ရှားခြင်း CPU ပြည့်သော
usleep(100000);
}
Socket_Close ($ ဆာဗာ);
>
</ code>
အထက်ပါကုဒ်များတွင်ကျွန်ုပ်တို့၏နားထောင်ခြင်း socket ($ server) သည်ပိတ်ဆို့ခြင်းမဟုတ်ဘဲ socket_accept () တွင်ပိတ်ဆို့ခြင်းမရှိပါ။ ဆက်သွယ်မှုအသစ်ကိုလက်ခံသည့်အခါတိုင်း client အသစ်ကိုပိတ်ဆို့ခြင်းကိုမပြုလုပ်နိုင်ပါ။ သို့သော်ကျွန်ုပ်တို့သည်လက်ခံသောအချက်အလက်များကိုကျွန်ုပ်တို့လုပ်ဆောင်သောနေရာတွင် 0 န်ဆောင်မှုကိုပိတ်ဆို့ခြင်းကိုတက်ကြွစွာပိတ်ထားသည် ။
၎င်းသည်အလွန်အသုံးများသောအသုံးပြုမှုနည်းလမ်းတစ်ခုဖြစ်ပြီး, ဥပမာအများအပြားတွင်အထူးအရေးကြီးသည် (Protocol Handshake Phase ကဲ့သို့သော) တွင်အထူးအရေးကြီးသည်။ ဥပမာအားဖြင့်, သင်သည် client ကိုပထမ ဦး ဆုံးအကြိမ်သတ်မှတ်ထားသော header အချက်အလက်များပါ 0 င်ရမည်ဟုဖော်ပြသည်။ ဤအချိန်တွင်ပိတ်ဆို့ခြင်းစာဖတ်ခြင်းကိုအသုံးပြုခြင်းသည်အလွန်အဓိပ္ပါယ်ရှိသောဖြစ်လာသည်။
Modes ကိုပြောင်းခြင်းကို switching လုပ်သည့်အခါသတိထားပါ - ပိတ်ဆို့ခြင်းမဟုတ်သောစာဖတ်ခြင်းကိုခေတ္တပိတ်ထားခြင်းဖြင့် "အတင်းအဓမ္မစစ်ဆေးရန်" နည်းလမ်းဖြစ်သည်။ အဆင်ပြေသော်လည်း 0 န်ဆောင်မှုခံယူသူသည်မည်သည့်ဒေတာကိုမဆိုမပို့ပါကဆာဗာသည်ကပ်နေလိမ့်မည်။ ၎င်းသည်အချိန်ကုန်ယန္တရားသို့မဟုတ်ကြိုတင်သတ်မှတ်ထားသောဒေတာအရှည်နှင့်ကိုက်ညီရန်အကြံပြုသည်။
ရေတိုပိတ်ဆို့ခြင်းအတွက်သင့်တော်သည် ။ ဤအမျိုးအစားပြောင်းလဲမှုသည်အချို့သောစစ်ဆင်ရေးများကိုပိတ်ဆို့ထားရမည့်အခြေအနေများအတွက်သင့်တော်ပြီးဆက်သွယ်ရေးလုပ်ငန်းစဉ်တစ်လျှောက်ပိတ်ဆို့ခြင်းကိုအသုံးပြုရန်မလိုအပ်ပါ။
Use socket_set_block() and socket_set_nonblock() to make your PHP socket programming more flexible. လုပ်ဆောင်ခြင်းယုတ္တိဗေဒအရသင့်လျော်သောပိတ်ဆို့ခြင်း mode ကိုရွေးချယ်နိုင်သည်။
နောက်ထပ် Socket Programming အလေ့အကျင့်များနှင့်ဥပမာများပိုမိုများပြားရန်အတွက်စာရွက်စာတမ်းများကိုဖတ်ရှုပါသို့မဟုတ်ကျွန်ုပ်တို့၏အရင်းအမြစ်ပလက်ဖောင်းကိုသွားပါ။