PHP-based network applications များကိုတီထွင်သည့်အခါအထူးသဖြင့်နားထောင်ခြင်းအတွက်တိကျသောဆိပ်ကမ်းများ (ဥပမာ HTTP ဆာ Socket Services စသည်တို့) သည် "ports များသိမ်းပိုက်" ပြ problem နာကိုကြုံတွေ့ရသည်။ 0 န်ဆောင်မှုကိုရပ်တန့်ပြီးနောက်ဤပြ problem နာသည်များသောအားဖြင့်ဖြစ်လေ့ရှိပြီး operating system သည် port ကိုသိမ်းပိုက်ထားပြီး 0 န်ဆောင်မှုကိုပြန်လည်စတင်ရန်နှင့်ဆိပ်ကမ်းကိုချည်နှောင်ခြင်းမခံရနိုင်ကြောင်းယုံကြည်သည်။
ဤပြ problem နာကိုထိရောက်စွာဖြေရှင်းရန် PHP သည် societ options များသတ်မှတ်ရန်အသုံးပြုနိုင်သည့် Socket_set_set_option function ကိုထောက်ပံ့ပေးသည်။ ၎င်းတို့အနက် SO_RREEADDR သည် port နေရာချထားရေးပြ problem နာကိုဖြေရှင်းနိုင်ရန်ကူညီနိုင်သည့်အသုံးအများဆုံးရွေးစရာတစ်ခုဖြစ်သည်။ ဤဆောင်းပါးသည် 0 န်ဆောင်မှုကိုပြန်လည်စတင်သည့်အခါအသုံးပြုသော port ကိုဖြည့်ဆည်းရန် Socke_set_Osttion ကို Socke_seadDr ကို မည်သို့ သတ်မှတ်မည်ကိုအသေးစိတ်ရှင်းပြပါလိမ့်မည်။
So_reuseaddr သည် port တစ်ခုဖြစ်သော Port ကို အချိန် _wait ပြည်နယ်တွင်နေရာချထားရန်ခွင့်ပြုသည့် socket option တစ်ခုဖြစ်သည်။ operating system သည် packets များအားလုံးကိုသန့်ရှင်းအောင်ပြုလုပ်ထားကြောင်းသေချာစေရန် Time_ Time_WAIT သို့အချိန်သတ်မှတ်ထားသည်။ သို့သော်စနစ်သည်အခြားဖြစ်စဉ်များကိုအချိန်မှဖြုတ်ခြင်းမှတားမြစ်ထားခြင်းကို Port_wait ပြည်နယ်ရှိဆိပ်ကမ်းသို့မတားဆီးနိုင်ပါ။ So_reuseadDr ကို သတ်မှတ်ပြီးနောက်တွင် Port ကို အချိန်ယူပြီး သည့်အခါသင်ဆိပ်ကမ်းကိုပြန်လည်ပေးနိုင်သည်။
PHP တွင် socket_set_set_option function ကိုအသုံးပြုထားပြီးဖြစ်သော socket အတွက်ရွေးချယ်စရာများကိုသတ်မှတ်ရန်အသုံးပြုသည်။ Syntax သည်အောက်ပါအတိုင်းဖြစ်သည် -
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_option</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$level</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$optname</span></span><span> , </span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-variable">$optval</span></span><span> )
</span></span>
$ socket : ရွေးချယ်စရာများကိုသတ်မှတ်ရန် socket အရင်းအမြစ်။
$ အဆင့် - Protocol layer, များသောအားဖြင့် sol_socket ဆိုသည်မှာ Socket-level option ကိုလည်ပတ်နေသည်ကိုဆိုလိုသည်။
$ optname : so_reuseaddr အတွက် option name, ဒီတန်ဖိုးက so_reuseaddr (များသောအားဖြင့် 1 ) ။
$ optval : so_reuseaddr အတွက် option ကိုတန်ဖိုး, ဒီတန်ဖိုးသည်များသောအားဖြင့် 1 ဖြစ်ပြီး option ကိုဖွင့်ထားကြောင်းညွှန်ပြသည်။
Port Watercancy ကိုရှောင်ရှားရန် Sociec_seadDr option ကို Socket_seadDr option ကိုမည်သို့အသုံးပြုရမည်ကိုပြသသည့်ရိုးရှင်းသော PHP PHPPP ဥပမာဖြစ်သည်။
<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">// တည်ဆောက်သည် SO_REUSEADDR ရွေးချယ်စရာများ</span></span><span>
</span><span><span class="hljs-variable">$optval</span></span><span> = </span><span><span class="hljs-number">1</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_REUSEADDR, </span><span><span class="hljs-variable">$optval</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">"တည်ဆောက်သည် SO_REUSEADDR ရွေးချယ်စရာများ失败: "</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">// သတ်မှတ်ထားသောမှချည်နှောင် IP နှင့် ports</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">"binding ပျက်ကွက်: "</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">"Socket အောင်မြင်စွာခညျြနှောငျ <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">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-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-variable">$clientSocket</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-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$clientSocket</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">"client connection ကိုလက်ခံရရှိသည်: "</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">"client တစ်ခုချိတ်ဆက်နေသည်!\n"</span></span><span>;
</span><span><span class="hljs-comment">// ဆက်သွယ်မှုကိုပိတ်ပါ</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</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>
Socket ကိုဖန်တီးပါ ။ TCP socket တစ်ခုဖန်တီးရန် Socket_create function ကိုသုံးသည်။ ဒီ function က created socket ကိုကိုယ်စားပြုတဲ့အရင်းအမြစ်ကိုပြန်လာပါတယ်။ ဖန်ဆင်းခြင်းပျက်ကွက်ပါက မှားယွင်းစွာ ပြန်လာသည်။
So_reuseadDr option ကိုသတ်မှတ်ပါ - souususeaddr ကို sockeuseaddr ကို socket_seadDr ကို သတ်မှတ်ထားတဲ့ sockeuseaddr ကို socket_seaddr ။
Bind Port : Created Socket ကိုသတ်မှတ်ထားသော IP address နှင့် port သို့တပ်ဆင်ရန် Socket_bind function ကိုသုံးပါ။ အကယ်. စည်းနှောင်ခြင်းသည်ပျက်ကွက်ပါကပရိုဂရမ်သည်အမှားအယွင်းတစ်ခုထုတ်ပေးလိမ့်မည်။
နားထောင်ခြင်းဆိပ်ကမ်း - Socket_listen function ကိုအသုံးပြုထားသည့် ports များကိုနားထောင်ရန်နှင့် client connection များကိုလက်ခံရန်အဆင်သင့်ဖြစ်နေပြီ။
client connection ကိုလက်ခံရရှိသည် ။ Socket_accept သည် client connection ကိုလက်ခံလိမ့်မည်။
Socke_SeadDr option ကို socket_set_option ဖြင့် setting လုပ်ခြင်းဖြင့်အထူးသဖြင့် 0 န်ဆောင်မှုပြန်လည်စတင်သည့်အခါ port ကိုသိမ်းပိုက်မှုပြ problem နာကိုထိထိရောက်ရောက်ဖြေရှင်းနိုင်သည်။ ဤရွေးချယ်မှုသည် အချိန်မီ လွင့်မျောနေသည့်အခါ port ကိုရှောင်ရှားရန်ခွင့်ပြုသည်။
So_reuseadDr option သည်သင့်အား operating system ၏ port အသုံးပြုမှုစည်းမျဉ်းများကိုကျော်လွှားရန်ခွင့်မပြုကြောင်းသတိပြုသင့်သည်။ Port သည် Time_wait ပြည်နယ်တွင်တည်ရှိသည့်အခြေအနေကိုအဓိကအားဖြင့်ဖြေရှင်းသည်။ အကယ်. သင်သည်အခြားအခြေအနေများတွင် port occupation ကိုသင်ကြုံတွေ့ရပါကပိုမိုရှုပ်ထွေးသောကွန်ယက်ဖွဲ့စည်းမှုသို့မဟုတ်လုပ်ငန်းစဉ်စီမံခန့်ခွဲမှုမဟာဗျူဟာများကိုစဉ်းစားရန်လိုအပ်နိုင်သည်။