လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_select ကိုအသုံးပြုနည်းကို Socket မျိုးစုံဖတ်လို့မရမလား။ PHP လက်တွေ့ကျတဲ့အကြံပေးချက်များရှင်းပြချက်

Socket_select ကိုအသုံးပြုနည်းကို Socket မျိုးစုံဖတ်လို့မရမလား။ PHP လက်တွေ့ကျတဲ့အကြံပေးချက်များရှင်းပြချက်

gitbox 2025-09-12
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// ဤစာရွက်စာတမ်းသည်သင်ကြားရေးရည်ရွယ်ချက်များအတွက်ဖြစ်သည်,ဘယ်လိုပြပါ PHP အတွက်အသုံးပြုခဲ့သည် socket_select မျိုးစုံကိုစစ်ဆေးပါ Socket ဖတ်လို့ရတယ်。</span></span><span>
</span><span><span class="hljs-comment">// ကျေးဇူးပြုပြီးသေချာအောင်လုပ်ပါ sockets တိုးချဲ့。</span></span><span>

</span><span><span class="hljs-comment">// ဥပမာတစ်ခုဖန်တီးပါ sockets(ဆာဆာ socket နှင့်အများအပြားဖောက်သည်များ socket),အဓိကယုတ္တိဗေဒကိုအာရုံစိုက်ရန်ဖန်တီးမှုဖြစ်စဉ်ကိုချန်လှပ်。</span></span><span>

</span><span><span class="hljs-comment">// -------------------------------</span></span><span>

</span><span><span class="hljs-meta">?&gt;</span></span><span>

</span><span><span class="hljs-comment"># အဲဒါကိုဘယ်လိုသုံးရမလဲ socket_select မျိုးစုံကိုစစ်ဆေးပါ Socket ဖတ်လို့ရတယ်?PHP လက်တွေ့ကျတဲ့ကျွမ်းကျင်မှု၏ရှင်းလင်းချက်</span></span><span>

ကွန်ယက်အခြေပြုဆက်သွယ်ရေးများဖွံ့ဖြိုးဆဲ PHP လျှောက်ထားတဲ့အခါ,ကျနော်တို့မကြာခဏတစ်ချိန်တည်းမှာဆက်သွယ်မှုမျိုးစုံ process လုပ်ဖို့လိုအပ်ပါတယ်,အထူးသဖြင့် chat ခန်းများတည်ဆောက်ရာတွင်、游戏ဆာဆာ或即时通信系统等场景中。အခုအချိန်တွင်,`</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>()` လုပ်ဆောင်ချက်များကိုအထူးသဖြင့်အရေးကြီးသည်。ဒါဟာသင့်အားမျိုးစုံကိုသွားခွင့်ပြုသည် socket ပိတ်ဆို့ခြင်းမဟုတ်သောဖတ်ရန်စစ်ဆေးမှုများအကြားဖျော်ဖြေသည်,ထိရောက်မှုကိုတိုးတက်စေသည်。

ဤဆောင်းပါးသည်သင့်အားမည်သို့အသုံးပြုရမည်ကိုအသေးစိတ်နားလည်စေလိမ့်မည် `socket_select` မျိုးစုံကိုစစ်ဆေးပါ socket ဖတ်လို့ရတယ်,နှင့်ရိုးရှင်းသောနှင့်လက်တွေ့ကျတဲ့ဥပမာပေးပါ。

</span><span><span class="hljs-comment">## ဘာလဲ socket_select?</span></span><span>

`</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>()` ဟုတ်ကဲ့ PHP အောက်ခြေ `</span><span><span class="hljs-title function_ invoke__">select</span></span><span>()` စနစ်ခေါ်ဆိုမှုများကို encapsulations。ဒါဟာအစုတခု detect လုပ်ဖို့အသုံးပြုသည် sockets ဟုတ်ကဲ့否可以进行读、ရေးသို့မဟုတ်ခြွင်းချက်စစ်ဆင်ရေး,နှင့်အချိန်ကိုသတ်မှတ်နိုင်ပါတယ်。

```php
</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> &amp;</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &amp;</span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &amp;</span><span><span class="hljs-variable">$except</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$tv_sec</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$tv_usec</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>)
</span></span>
  • $ ဖတ်ရန် : သင်ဖတ်လို့မရသော socketets သင်စောင့်ကြည့်လိုသော sockets ။

  • $ ရေးချေ - Sockets (NULL လွန်သွားနိုင်သည်) ကိုသင်စစ်ဆေးလိုသည်။

  • $ မှလွဲ . - သင်သည်ခြွင်းချက် socket များ (Null Pass) ရှိမရှိစောင့်ကြည့်လိုသည်။

  • $ tv_sec နှင့် $ tv_usec : စက္ကန့်အနည်းငယ်စက္ကန့်နှင့် microseconds အသီးသီးဖြစ်ကြသည်။

လက်တွေ့ကျတဲ့ဥပမာ - Socket မျိုးစုံဖတ်ရန်အချက်အလက်များရှိ,

ဤတွင် PHP code snippet တစ်ခုမှာ client sockets မျိုးစုံအချက်အလက်များရောက်ရှိလာခြင်းရှိမရှိစစ်ဆေးသည်

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 创建主ဆာဆာ socket</span></span><span>
</span><span><span class="hljs-variable">$server</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-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-number">8888</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);

</span><span><span class="hljs-comment">// Non-blocking ကိုသတ်မှတ်</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);

</span><span><span class="hljs-variable">$clients</span></span><span> = [</span><span><span class="hljs-variable">$server</span></span><span>];

</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
    </span><span><span class="hljs-variable">$readSockets</span></span><span> = </span><span><span class="hljs-variable">$clients</span></span><span>;
    </span><span><span class="hljs-variable">$writeSockets</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
    </span><span><span class="hljs-variable">$exceptSockets</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;

    </span><span><span class="hljs-comment">// အရာသူတို့ကို check လုပ်ထားတယ် socket ဖတ်နိုင်သော(ပိတ်ဆို့ခြင်းမရှိပါ,1 ဒုတိယအကြိမ်အချိန်)</span></span><span>
    </span><span><span class="hljs-variable">$numChangedSockets</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-variable">$readSockets</span></span><span>, </span><span><span class="hljs-variable">$writeSockets</span></span><span>, </span><span><span class="hljs-variable">$exceptSockets</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-variable">$numChangedSockets</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_select ဆုံးရှုံး:"</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>()) . PHP_EOL;
        </span><span><span class="hljs-keyword">break</span></span><span>;
    }

    </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$readSockets</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$sock</span></span><span>) {
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$sock</span></span><span> === </span><span><span class="hljs-variable">$server</span></span><span>) {
            </span><span><span class="hljs-comment">// ဆက်သွယ်မှုအသစ်ရှိတယ်</span></span><span>
            </span><span><span class="hljs-variable">$newClient</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
            </span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$newClient</span></span><span>);
            </span><span><span class="hljs-variable">$clients</span></span><span>[] = </span><span><span class="hljs-variable">$newClient</span></span><span>;
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ဖောက်သည်အသစ်ကိုချိတ်ဆက်ထားသည်。"</span></span><span> . PHP_EOL;
        } </span><span><span class="hljs-keyword">else</span></span><span> {
            </span><span><span class="hljs-comment">// client တစ်ခုသည်ဒေတာများကိုပို့သည်</span></span><span>
            </span><span><span class="hljs-variable">$data</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>, PHP_NORMAL_READ);
            </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span> || </span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-string">""</span></span><span>) {
                </span><span><span class="hljs-comment">// client ကို disconnection</span></span><span>
                </span><span><span class="hljs-variable">$index</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_search</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>, </span><span><span class="hljs-variable">$clients</span></span><span>);
                </span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$clients</span></span><span>[</span><span><span class="hljs-variable">$index</span></span><span>]);
                </span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
                </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"client ကို disconnection。"</span></span><span> . PHP_EOL;
            } </span><span><span class="hljs-keyword">else</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__">trim</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>) . PHP_EOL;
            }
        }
    }
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

အဓိကအချက်များအကျဉ်းချုပ်

  1. ပိတ်ဆို့ခြင်း non-blocking socket : အဓိကလုပ်ငန်းစဉ်ကိုပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန် Socketets အားလုံးသည်ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုသတ်မှတ်သင့်သည်။

  2. အဓိက Socket Check check connection တောင်းဆိုမှု - Socket_select သည် အဓိက socket ကိုဖတ်နိုင်သည်ကိုရှာဖွေတွေ့ရှိပါက client connection အသစ်တစ်ခုရှိသည်ဟုဖော်ပြသည်။

  3. client socket check data data : client socket ကိုဖတ်လို့ရတဲ့အခါမှာ client ဟာဒေတာကိုပို့တယ်ဆိုတာကိုဆိုလိုသည်။

  4. မှတ်စု : အကယ်. ဖတ်ရန်မအောင်မြင်ပါကအချည်းနှီးသော string ကိုပြန်ရောက်လျှင် client ကိုအဆက်ပြတ်သည်ဟုယူဆသင့်သည်။

ကောက်ချက်

Socket_select () သည်တစ်ပြိုင်နက်တည်း socket compunication များကိုကိုင်တွယ်ရန်အတွက်အဓိကကိရိယာတစ်ခုဖြစ်သည်။ ဆက်သွယ်မှုတစ်ခုစီတွင်ချည်သို့မဟုတ်လုပ်ငန်းစဉ်တစ်ခုစီရှိသည့်အချက်နှင့်နှိုင်းယှဉ်ပါက Select Model သည်ပိုမိုပေါ့ပါး။ ထိန်းချုပ်နိုင်သောဆက်သွယ်မှုများစွာကိုစီမံနိုင်သည်။ သင်ကျွမ်းကျင်သော PHP ကွန်ယက်လျှောက်လွှာကိုပိုမိုတည်ငြိမ်ပြီးထိရောက်စေလိမ့်မည်။

ဤဆောင်းပါးသည်သင်ကအသုံးပြုမှုအခြေအနေများနှင့် Socket_selection ၏အသုံးပြုမှုအခြေအနေများနှင့်အလေ့အကျင့်များကိုနားလည်နိုင်ပြီးသင်၏စီမံကိန်းတွင်အမှန်တကယ်အခန်းကဏ် play မှပါ 0 င်နိုင်သည်ဟုကျွန်ုပ်မျှော်လင့်ပါသည်။

 <span></span>