တစ်ပြိုင်နက်တည်းတစ်ပြိုင်နက်တည်းကွန်ယက်အက်ပလီကေးရှင်းများတွင်ဆက်သွယ်မှု၏အပြောင်းအလဲစွမ်းဆောင်ရည်ကိုပိုမိုကောင်းမွန်အောင်ဘယ်လိုလုပ်ရမလဲဆိုတာအရမ်းအရေးပါတဲ့ပြ issue နာပါ။ အထူးသဖြင့် PHP အတွက် PHP အတွက် PHP ကိုအသုံးပြုသောအခါ Socket Programming သည်အလွန်အသုံးများသောနည်းလမ်းဖြစ်သည်။ ပရိုဂရမ်းမင်း Sockarch Sockets တွင်သင့်လျော်သော socket options များကိုသတ်မှတ်ခြင်းသည်စနစ်စွမ်းဆောင်ရည်နှင့်တုံ့ပြန်မှုမြန်နှုန်းကိုထိရောက်စွာတိုးတက်စေနိုင်သည်။
မြောက်မြားစွာ socket options များအနက် So_RCVBUFF (Buffer Size Size Size) တွင်အထူးအရေးကြီးသော parameter တစ်ခုဖြစ်သည်။ Socket_set_set_option function သည် PHP တွင် socket options များသတ်မှတ်ရန်အသုံးပြုသော function တစ်ခုဖြစ်သည်။ system ၏ထုတ်လုပ်မှုစွမ်းအားကိုတိုးတက်စေရန် So_RCVBUF ၏တန်ဖိုးကိုကျွန်ုပ်တို့ညှိနိုင်သည်။
So_RCVBUFF သည်လက်ခံရရှိသောကြားခံအရွယ်အစားကိုသတ်မှတ်ပေးသော socket option တစ်ခုဖြစ်သည်။ Operating System သည်ကွန်ယက်မှရရှိသောအချက်အလက်များကိုယာယီသိမ်းဆည်းရန် operating system ကိုအသုံးပြုသောနေရာဖြစ်သည်။ မြင့်မားသောတစ်ပြိုင်နက်တည်းတွင်စနစ်သည်များစွာသောအချက်အလက်များရရှိနိုင်ပါသည်။ ပုံမှန်ကြားခံအရွယ်အစားသည်တစ်ပြိုင်နက်တည်းဆက်သွယ်မှုများစွာကြောင့်ဖြစ်ရတဲ့အချက်အလက်ဖိအားကိုမဖြေရှင်းနိုင်ပါ။
So_RCVBUFF ၏အရွယ်အစားကိုညှိခြင်းအားဖြင့်ဒေတာများကိုလက်ခံရရှိရန် Socket ၏စွမ်းရည်ကိုပြောင်းလဲနိုင်သည်။ အကယ်. ကြားခံသည်သေးငယ်လွန်းပါကအချက်အလက်နှေးနှေးမှုနှေးကွေးခြင်းကြောင့်စနစ်သည်အချက်အလက်ဆုံးရှုံးမှုသို့မဟုတ်တောင်းဆိုမှုများကိုနှောင့်နှေးစေနိုင်သည်။ ဆန့်ကျင်ဘက်အနေဖြင့်ကြားခံသည်အလွန်ကြီးလွန်းပါကမှတ်ဉာဏ်ဖြုန်းတီးနိုင်ပြီးစနစ်သည်အလွန်အကျွံစားသုံးနိုင်သည်။ ထို့ကြောင့်သင့်လျော်သောကြားခံအရွယ်အစားကိုရှာဖွေခြင်းသည်စွမ်းဆောင်ရည်ကိုအကောင်းဆုံးဖြစ်စေရန်အရေးကြီးသည်။
PHP တွင် So_RCVBUF ထုတ်အပါအ 0 င် Socket_set_option function ကိုသင်အသုံးပြုနိုင်သည်။ ဤလုပ်ဆောင်ချက်၏အခြေခံ syntax သည်အောက်ပါအတိုင်းဖြစ်သည် -
<span><span><span class="hljs-title function_ invoke__">socket_set_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_RCVBUF, </span><span><span class="hljs-variable">$size</span></span><span>);
</span></span>$ socket : ဖန်တီးထားတဲ့ socket အရင်းအမြစ်။
sol_socket : option level ကို socket တစ်ခုအဖြစ်သတ်မှတ်ပါ။
SO_RCVBUF : သတ်မှတ်ရမည့် option ကိုဖော်ပြရန်ဖြစ်သည်။
$ အရွယ်အစား - လက်ခံရမည့်ကြားခံရစာကို bytes တွင်သတ်မှတ်ထားရမည်။
မြင့်မားသောတစ်ပြိုင်နက်တည်းဆက်သွယ်မှုကိုကိုင်တွယ်သည့်အခါဆာဗာသည် 0 န်ဆောင်မှုခံယူသူများ၏တောင်းဆိုမှုများကိုလျင်မြန်စွာလက်ခံပြီးလုပ်ဆောင်ရန်လိုအပ်သည်။ ကြားခံအရွယ်အစားသည်ဒေတာ ebe ည့်ခံနိုင်စွမ်းကိုတိုက်ရိုက်သက်ရောက်သည်။ လက်ခံရရှိသည့်အချက်အလက်များသည်ကြားခံ၏စွမ်းဆောင်ရည်ထက်ကျော်လွန်သောအခါစနစ်သည်အချက်အလက်များကိုစွန့်ပစ်နိုင်သည်, ၎င်းသည်အချက်အလက်များကိုစွန့်ပစ်ခြင်း, ထို့ကြောင့်ကျိုးကြောင်းဆီလျော်သောကြားခံအရွယ်အစားသည်ဒေတာ reception ည့်ခံပွဲ၏ထိရောက်မှုကိုသိသိသာသာတိုးတက်စေနိုင်သည်။
ဥပမာအားဖြင့်, တစ်ပြိုင်နက်တည်းဆက်သွယ်မှုများစွာကိုကိုင်တွယ်သောအခါ, So_rcvbuf setting သည်သေးငယ်လွန်းပါကစနစ်သည်ကြားခံကိုမကြာခဏလျှံသွားလိမ့်မည်။ ဆန့်ကျင်ဘက်အနေဖြင့်ကြားခံသည်ကြီးမားလွန်းပါက၎င်းသည်အချက်အလက်များပိုမိုများပြားလာနိုင်သော်လည်း၎င်းသည်စနစ်မှတ်ဉာဏ်များပြားလာနိုင်သည်, အခြားဖြစ်စဉ်များသို့မဟုတ်ချည်များကွပ်မျက်ခြင်းကိုအကျိုးသက်ရောက်သည်။
So_RCVBUF ကို ကျိုးကြောင်းဆီလျော်စွာညှိခြင်းအားဖြင့်အောက်ပါ optimization သက်ရောက်မှုများကိုအောင်မြင်နိုင်သည်။
အချက်အလက်ဆုံးရှုံးမှုကိုလျှော့ချပါ။ ဥပမာအားဖြင့်တစ်ပြိုင်နက်တည်းဆက်သွယ်မှုတွင်ရရှိသောကြားခံကိုတိုးမြှင့်ခြင်းကအချက်အလက်ဆုံးရှုံးမှုကိုလျှော့ချနိုင်ပြီး Buffer လျှံမှုကြောင့်ဖြစ်ရတဲ့ packet ဆုံးရှုံးမှုကိုလျှော့ချနိုင်ပြီး buffer လျှံ
အပြောင်းအလဲနဲ့ပါဝါကိုတိုးတက်အောင်လုပ်ခြင်း - သင့်လျော်သောကြားခံများသည်ပိတ်ဆို့မှုများကိုတိုင်းဒေသကြီးရေးဆွဲခြင်းတိုင်းတာမှုများတိုင်းကိုလျှော့ချနိုင်ပြီးစနစ်တကျအားဖြည့်ခြင်းများကိုတိုးပွားစေသည်။
လက်ျာလက်ရှိများကိုလျှော့ချပါ။ ကြားခံအရွယ်အစားတိုးမြှင့်ပြီးနောက်ဆာဗာသည်တောင်းဆိုမှုများကိုတောင်းဆိုခြင်းနှင့်တုံ့ပြန်မှုမြန်နှုန်းကိုပိုမိုကောင်းမွန်စေရန်အတွက်ဆာဗာသည်စောင့်ဆိုင်းချိန်ကိုလျှော့ချနိုင်သည်။
သင့်လျော်သောလက်ခံသည့်ကြားခံအရွယ်အစားကိုရွေးချယ်ခြင်းသည်ဆာဗာမှတ်ဉာဏ်, ကွန်ယက် bandwidth, တောင်းဆိုခြင်းအမျိုးအစားနှင့်စနစ်၏အမှန်တကယ်ဝန်အပါအ 0 င်အချက်အမျိုးမျိုးပေါ်တွင်မူတည်သည်။
ဒီမှာညှိနှိုင်းမှုအကြံပြုချက်အနည်းငယ်ရှိပါတယ်:
ဆာဗာမှတ်ဉာဏ်နှင့်ဝန်နှင့်အညီ - ဆာဗာမှတ်ဉာဏ်ကြီးသည်ဆိုပါက So_RCVBUF ၏တန်ဖိုးသည် throughput ကိုတိုးမြှင့်နိုင်ရန်သင့်လျော်စွာတိုးပွားလာနိုင်သည်။ အကယ်. system load သည်မြင့်မားပါကအချို့သောကြားခံများကိုပေါင်းထည့်ခြင်းသည်မှတ်ဥာဏ်အလွန်အကျွံတက်လာပြီးစွမ်းဆောင်ရည်ပျက်ပြားသွားသည်။
bandwidth အခြေအနေနှင့်ပေါင်းစပ် - ဆာဗာ၏ကွန်ယက် bandwidth သည်ကြီးမားပါကပိုမိုဒေတာများကိုလုပ်ဆောင်ရန်အတွက်ကြားခံအရွယ်အစားတိုးလာနိုင်သည်။ ဆန့်ကျင်ဘက်အနေဖြင့်, bandwidth သေးငယ်လျှင်, အလွန်အကျွံဒေတာ backlog ကိုရှောင်ရှားရန် bandwidth သေးငယ်လျှင် Buffer အရွယ်အစားကိုစနစ်တကျထိန်းချုပ်ရန်လိုအပ်သည်။
စမ်းသပ်မှုရလဒ်များအရ - အကောင်းဆုံးနည်းလမ်းမှာအကောင်းဆုံးနည်းလမ်းမှာစွမ်းဆောင်ရည်စစ်ဆေးမှုများကိုလုပ်ဆောင်ရန်, ကွဲပြားခြားနားသောကြားခံအရွယ်အစားကိုနှိုင်းယှဉ်ခြင်း,
Socket Permission ကိုအကောင်းဆုံးဖြစ်စေရန် Socke_set_option ကို Socket_set_option ကို မည်သို့အသုံးပြုရမည်ကိုပြသသည့်ရိုးရှင်းသောဥပမာတစ်ခုမှာဤနေရာတွင်ဖော်ပြထားသည်။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// a TCP socket</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ဖန်တီး. မရပါ socket: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// လက်ခံရရှိ buffer အရွယ်အစားကိုသတ်မှတ်ပါ</span></span><span>
</span><span><span class="hljs-variable">$buffer_size</span></span><span> = </span><span><span class="hljs-number">1024</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span>; </span><span><span class="hljs-comment">// 1MB</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_set_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_RCVBUF, </span><span><span class="hljs-variable">$buffer_size</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法လက်ခံရရှိ buffer အရွယ်အစားကိုသတ်မှတ်ပါ: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// ချည်နေှာင် socket လိပ်စာနှင့်ဆိပ်ကမ်းသို့</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法ချည်နေှာင်地址: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// ဆက်သွယ်မှုကိုနားထောင်ပါ</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ဆက်သွယ်မှုအတွက်နားမထောင်နိုင်ပါ: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ဆာဗာသည်နားထောင်နေသည် <span class="hljs-subst">$host</span></span></span><span>:</span><span><span class="hljs-subst">$port</span></span><span>...\n";
</span><span><span class="hljs-comment">// ဆက်သွယ်မှုများနှင့်လုပ်ငန်းစဉ်အချက်အလက်များကိုလက်ခံပါ</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) {
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Hello from server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>));
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>ဤကုဒ်တွင် TCP socket တစ်ခုကို ဖန်တီး. လက်ခံသောကြားခံအရွယ်အစားကို Socket_set_option မှ 1MB အထိသတ်မှတ်သည်။ ထို့နောက်ကျွန်ုပ်တို့သည်ဒေသခံလိပ်စာနှင့်ဆိပ်ကမ်းကိုချည်နှောင်ပြီး client connection များကိုနားထောင်ကြသည်။
Socket_set_set_option နှင့် so_rcvbuf ကိုပေါင်းစပ်ခြင်းအားဖြင့်ကျွန်ုပ်တို့သည် socket ady beffer အရွယ်အစားကိုချိန်ညှိနိုင်ပြီး, ကျိုးကြောင်းဆီလျော်သောကြားခံချိန်ညှိချက်များသည်အချက်အလက်အပြောင်းအလဲများကိုထိရောက်စွာတိုးတက်စေနိုင်သည်။ လက်တွေ့ကျသောအပလီကေးရှင်းများ၌၎င်းသည်ဆာဗာ၏စွမ်းဆောင်ရည်နှင့်အကောင်းဆုံးအပြောင်းအလဲအတွက်အကျိုးသက်ရောက်မှုကိုရရှိရန်အတွက် server ၏စွမ်းဆောင်ရည်နှင့်အညီချိန်ညှိသင့်သည်။