PHP တွင် socket_listen function ကို socket socket ကိုနားထောင်ရန် socket တစ်ခုဖွင့်ရန်အသုံးပြုသည်။ များသောအားဖြင့်ဤ function ကို client tolks များကိုကိုင်တွယ်ရန် server socke socket ကိုတည်ဆောက်ရန် Socket_create နှင့် Socket_bind နှင့်အသုံးပြုလိမ့်မည်။ ဤဆောင်းပါးသည် socket_listen function ကို အသုံးပြု. အသေးစိတ်အချက်အလက်များကိုအသေးစိတ်ခွဲခြမ်းစိတ်ဖြာပြီးနားထောင်ခြင်းကိုမှန်ကန်စွာဖွင့်ရမည်ကိုလမ်းညွှန်လိမ့်မည်။
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_listen</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">$backlog</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> )
</span></span>
$ socket : socket_create မှတဆင့်ဖန်တီးထားသော socket အရင်းအမြစ်နှင့် socket_bind မှတဆင့်လိပ်စာနှင့်ဆိပ်ကမ်းသို့ခညျြနှောငျ။
$ backlog : ဆိုင်းငံ့ထားဆက်သွယ်မှုတောင်းဆိုမှုများကိုအများဆုံးအရေအတွက်ကိုသတ်မှတ်သည်။ ၎င်းသည် operating system kernel မှခွင့်ပြုထားသော unprocessed connection များ၏တန်းစီအရှည်များကိုသတ်မှတ်သည်။ အကယ်. တန်းစီသည်အပြည့်အ 0 ရှိပါကဆက်သွယ်မှုအသစ်တစ်ခုကိုငြင်းဆိုလိမ့်မည်။ ဘုံတန်ဖိုးမှာ 128 ဖြစ်သော်လည်းလိုအပ်ချက်များနှင့်အညီချိန်ညှိနိုင်သည်။
အောင်မြင်သောအခါ 0 ပြန်လာ 0 ကို ပြန်ပို့ပါ။
ကျရှုံးခြင်းအပေါ် မှားယွင်းသောအယူမှား သည်ပြန်လာပြီးအမှားအချက်အလက်များကို socket_last_Error မှတဆင့်ရယူနိုင်သည်။
Socket_listen ကို အသုံးပြုရန်သင်များသောအားဖြင့် socket_create တစ်ခုဖန်တီးရန်လိုအပ်ပြီးသတ်မှတ်ထားသော IP address နှင့် port ကို socket_bind နှင့်ချိတ်ထားသည်။ ထို့နောက်သင်သည် Socket_listen ကို အသုံးပြု. client မှ connection တောင်းဆိုမှုများကိုနားထောင်ရန် Socket_listen ကိုသုံးနိုင်သည်။ ဤတွင်အခြေခံဆာဗာဥပမာတစ်ခုဖြစ်သည်။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// ဖန်တီးTCPSockets</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">"无法ဖန်တီးSockets: "</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">// သတ်မှတ်ထားသောမှချည်နှောင်IPလိပ်စာနှင့်ဆိပ်ကမ်း</span></span><span>
</span><span><span class="hljs-variable">$address</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-variable">$result</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">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</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-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span><span><span class="hljs-comment">// 开始监听Sockets</span></span><span>
</span><span><span class="hljs-variable">$result</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-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</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-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">$address</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-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">"ဆက်သွယ်မှုကိုလက်ခံရရှိသည်失败: "</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"client ကိုချိတ်ဆက်ထားသည်\n"</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_create မှတဆင့် TCP Socket တစ်ခုကိုဖန်တီးပါ။
socket_bind ကို 127.0.0.1:8080 , I.E. Port 8080 ကို Local address of Socket_bind ကိုသုံးပါ။
Connection Request ကိုစတင်နားထောင်ရန် Societock_listen နှင့်ဒုတိယ parameter 5 သည် မရှိသေးသောဆက်သွယ်မှုအများဆုံးသောဆက်သွယ်မှုအများဆုံးအရေအတွက်ကိုညွှန်ပြသည်။
client မှဆက်သွယ်မှုကိုလက်ခံရန် Socket_accept ကို သုံးပါ။
Socket_listen ၏ဒုတိယ parameter သည် backlog သည် kernel ရှိဆက်သွယ်မှုတန်း၏အရှည်ကိုသတ်မှတ်သည်။ ဤသည်တန်းစီသည် socket_accept မှလက်ခံခြင်းမရှိသောဆက်သွယ်မှုများကိုသိမ်းဆည်းထားသည်။ ဤသို့သော parameter သည်တတ်နိုင်သမျှကြီးမားသည်မဟုတ်ကြောင်းသတိပြုသင့်သည်။ ပိုမိုမြင့်မားသောတန်ဖိုးများကိုပိုမိုစောင့်ဆိုင်းသောဆက်သွယ်မှုများနှင့်လိုက်လျောညီထွေဖြစ်အောင်ပြုလုပ်နိုင်သော်လည်း၎င်းသည်စနစ်အရင်းအမြစ်များပိုမိုများပြားလာနိုင်ပြီး settings တွင်စွမ်းအင်မရှိတော့ပါကအရင်းအမြစ်များကိုဖြုန်းတီးနိုင်သည်။
128 : ဤသည်ဘုံ default တန်ဖိုးသည် application အများစုအတွက်သင့်တော်သည်။
0 : 0 မှ 0 င်ပါကစနစ်သည်ပုံမှန်တန်းတူအရှည်ကိုသုံးလိမ့်မည်။ ယေဘုယျအားဖြင့်ပြောရလျှင် 0 တန်ဖိုးကိုစိုးရိမ်စရာမလိုပါ။
ကွန်ယက်တစ်ခုပရိုဂရမ်ရေးဆွဲသည့်အခါအမှားများသည်မလွှဲမရှောင်သာရှိသည်။ socket_listen ပျက်ကွက်သည့်အခါ မှားယွင်းသောမှားယွင်းသော ပြန်လာလိမ့်မည်။ လွယ်ကူသော debugging အတွက်အသေးစိတ်အမှားသတင်းအချက်အလက်များကိုသင်ရရှိရန် Socket_Last_Error ကို သုံးနိုင်သည်။ ဥပမာအားဖြင့်:
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$errorCode</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"နားထောင်ခြင်းမအောင်မြင်ပါ, အမှားကုဒ်: <span class="hljs-subst">$errorCode</span></span></span><span>, အမှားသတင်းစကား: " . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$errorCode</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
ဤကုဒ်သည်ပြ problems နာများကိုဖြေရှင်းရန်ကူညီရန်အသေးစိတ်အမှားအချက်အလက်များကိုပြန်လည်ပေးပို့လိမ့်မည်။
Non-blocking မဟုတ်သော mode : socket ကိုနားထောင်နေစဉ်တွင်ပရိုဂရမ်ကိုမပိတ်ရန်လိုပါက socket_set_setonblock function ကိုသုံးနိုင်သည်။
Multithreaded / Multi-process : တစ်ပြိုင်နက်တည်းဆက်သွယ်မှုများစွာကိုကိုင်တွယ်ဖြေရှင်းသည့်အခါအဓိကချည်နှောင်ခြင်းမရှိဘဲဖောက်သည်များ၏ဆက်သွယ်မှုမျိုးစုံကိုကိုင်တွယ်ရန် ( PCNTL_Fork သို့မဟုတ် pcntl_form marke ား,
သန့်ရှင်းရေး - Socket ကိုအသုံးပြုပြီးနောက် Socket_Cole_Close ကို မမေ့ပါနှင့်။
Socket_listen သည် PHP Socket Programming တွင်အလွန်အရေးကြီးသောလုပ်ဆောင်ချက်ဖြစ်သည်။ 0 န်ဆောင်မှုခံယူသူကိုချိတ်ဆက်ရန်စောင့်ဆိုင်းရန်ချည်နှောင်ရန်ခလုတ်ကိုသတ်မှတ်ရန်မှာတာဝန်ရှိသည်။ Socket_listen ၏မှန်ကန်သောအသုံးပြုမှုသည်သင်၏ PHP application ကို client မှဆက်သွယ်မှုတောင်းဆိုမှုများကိုကိုင်တွယ်ရန်နှင့်တည်ငြိမ်သောကွန်ရက် 0 န်ဆောင်မှုများကိုပေးရန်ခွင့်ပြုနိုင်သည်။ backlog parameters တွေကိုမှန်ကန်စွာသတ်မှတ်ထားပြီးအမှားအယွင်းများကိုစနစ်တကျကိုင်တွယ်ဖြေရှင်းနိုင်သည်။ ၎င်းသည်လျှောက်လွှာ၏ယုံကြည်စိတ်ချရမှုနှင့်တည်ငြိမ်မှုကိုထိရောက်စွာတိုးတက်စေနိုင်သည်။