<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// အောက်ပါအကြောင်းအရာများသည်ဆောင်းပါး၏အဓိကစာသားနှင့်ဘာမှမဆိုင်ပါဘူး</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ဒီမှာဥပမာတစ်ခုပါ PHP လုံးပေါင်းပြဌါန်းသည့်ဉပဒေ,ဆောင်းပါးနှင့်မသက်ဆိုင်သော preface ကိုပြသရန်အသုံးပြုသည်。\n"</span></span><span>;
-------------------------------------------------------------------------------
<span class="hljs-comment">/**
* ဘယ်လိုဖြတ်သန်းရမလဲ stream_set_blocking ကြီးကြပ်ခြင်း PHP အတွက် sockets ၏အပြုအမူကိုဖတ်ရှုခြင်း,ကွန်ယက်လျှောက်လွှာစွမ်းဆောင်ရည်ကိုတိုးတက်အောင်လုပ်ပါ?
*
* တည်နေ PHP network programming ၌တည်၏,Sockets(socket)အဆိုပါဖတ်အပြုအမူသည်လျှောက်လွှာစွမ်းဆောင်ရည်အပေါ်တိုက်ရိုက်သက်ရောက်မှုရှိပါတယ်。ပုံမှန်အားဖြင့်,
* PHP 的Sockets操作是阻塞式的,ဒါကဖတ် function ကိုခေါ်တဲ့အခါမှာဖြစ်ပါတယ်(ကဲ့သို့ fread သို့မဟုတ် stream_get_contents)နာရီ,
* ကဲ့သို့果没有数据到达,ဒီအစီအစဉ်ကိုစောင့်ဆိုင်းပါလိမ့်မယ်,ဒေတာရရှိနိုင်ပါသည်သည်အထိ。这种行为တည်နေ高并发သို့မဟုတ်长连接场景下容易导致性能瓶颈。
*
* ဒီပြ problem နာကိုဖြေရှင်းရန်,PHP ထောက်ပံ့ stream_set_blocking လုပ်ဆောင်ချက်,可以灵活地ကြီးကြပ်ခြင်းSockets的mode ကိုပိတ်ဆို့ခြင်း。
*
* တစ်、stream_set_blocking အခြေခံအသုံးပြုမှု
*
* လုပ်ဆောင်ချက်原型:
* bool stream_set_blocking ( resource $stream , int $mode )
*
* parameter ကိုဖော်ပြချက်:
* - $stream: Socketsပစ္စည်းအင်းအား(stream ပစ္စည်းအင်းအား)。
* - $mode: mode ကိုပိတ်ဆို့ခြင်း,1 ပိတ်ဆို့ခြင်းဖော်ပြသည်(blocking),0 Non- ပိတ်ဆို့ခြင်းဖော်ပြသည်(non-blocking)。
*
* နမူနာ:
*/</span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://127.0.0.1:8080"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ဆက်သွယ်မှုမအောင်မြင်ပါ: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 设置非mode ကိုပိတ်ဆို့ခြင်း</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-comment">// ဒေတာကိုဖတ်ရန်ကြိုးစားပါ</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">8192</span></span><span>);
</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"လက်ရှိဖတ်လို့မရတဲ့ဒေတာမရှိဘူး,အဆိုပါအစီအစဉ်ကို execute ဆက်လက်。\n"</span></span><span>;
} </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 class="hljs-subst">$data</span></span></span><span>\n";
}
}
-------------------------------------------------------------------------------
<span class="hljs-comment">/**
* နှစ်、mode ကိုပိတ်ဆို့ခြင်း与非mode ကိုပိတ်ဆို့ခြင်း的差异
*
* 1. mode ကိုပိတ်ဆို့ခြင်း(blocking)
* - fread သို့မဟုတ် fgets ပြန်မလာမီရောက်ရှိရန်ဒေတာကိုစောင့်ဆိုင်းပါလိမ့်မယ်。
* - တစ်ခုတည်းချည်များအတွက်သင့်လျော်သော、အနိမ့်တစ်ပြိုင်နက်တည်းဖြစ်ရပ်များ。
* - လွယ်ကူသော,但可能导致长နာရီ间等待阻塞整个脚本。
*
* 2. 非mode ကိုပိတ်ဆို့ခြင်း(non-blocking)
* - fread 等လုပ်ဆောင်ချက်立即返回,若无数据则返回空သို့မဟုတ် false。
* - ပြတ်တောင်းပြတ်တောင်းအပြောင်းအလဲအတွက်သင့်လျော်သော、မြင့်မားသော concurrencency ဇာတ်လမ်းဖြစ်စဉ်。
* - ပေါင်းစပ်နိုင်ပါတယ် stream_select 监控多个Sockets的可读状态,ဤသည်ကွန်ယက်လျှောက်လွှာစွမ်းဆောင်ရည်ကိုတိုးတက်စေသည်。
*
* သုံး、ပေါင်းစပ်ထားသော stream_select စွမ်းဆောင်ရည်တိုးတက်ကောင်းမွန်အောင်
*
* stream_select စီးဆင်းမှုမျိုးစုံဖတ်လို့မရဘူးရှိမရှိစောင့်ကြည့်နိုင်ပါတယ်、可写သို့မဟုတ်发生异常:
*
* နမူနာ:
*/</span>
</span><span><span class="hljs-variable">$read</span></span><span> = [</span><span><span class="hljs-variable">$socket</span></span><span>];
</span><span><span class="hljs-variable">$write</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$except</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">2</span></span><span>; </span><span><span class="hljs-comment">// 超နာရီနာရီ间 2 စက်ဏန့်</span></span><span>
</span><span><span class="hljs-variable">$num_changed_streams</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_select</span></span><span>(</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-variable">$except</span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$num_changed_streams</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出错\n"</span></span><span>;
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$num_changed_streams</span></span><span> === </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"超နာရီ,ဖတ်လို့မရတဲ့ဒေတာမရှိဘူး\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$read</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$r</span></span><span>) {
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$r</span></span><span>, </span><span><span class="hljs-number">8192</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ဒေတာကိုလက်ခံရရှိခဲ့သည်: <span class="hljs-subst">$data</span></span></span><span>\n";
}
}
-------------------------------------------------------------------------------
<span class="hljs-comment">/**
* လေး、လက်တွေ့ကျတဲ့ applications အတွက်စွမ်းဆောင်ရည် optimization အကြံပြုချက်များ
*
* 1. တည်နေ高并发网络应用中,尽量အသုံးပြု非mode ကိုပိတ်ဆို့ခြင်း读取Sockets,လုပ်ငန်းစဉ်တစ်ခုလုံးကိုနှေးကွေးသောဆက်သွယ်မှုတစ်ခုဖြင့်ပိတ်ဆို့ခြင်းကိုရှောင်ပါ。
* 2. အသုံးပြု stream_select သို့မဟုတ်类似事件循环机制(ကဲ့သို့ ReactPHP)来轮询多个Sockets。
* 3. ရှည်လျားသောဆက်သွယ်မှုများအတွက်,合理设置读取超နာရီနာရီ间,အဆုံးမဲ့ပိတ်ဆို့မှုကိုရှောင်ကြဉ်ပါ。
* 4. 避免တည်နေmode ကိုပိတ်ဆို့ခြင်း下处理大量数据,必要နာရီ可分块读取သို့မဟုတ်အသုံးပြု缓冲。
*
* 通过合理အသုံးပြု stream_set_blocking နှင့်အဖြစ်အပျက် loop ယန္တရား,သိသိသာသာတိုးတက်အောင်လုပ်နိုင်ပါတယ် PHP တုံ့ပြန်မှုမြန်နှုန်းနှင့်ကွန်ယက်အက်ပလီကေးရှင်းများ。
*/</span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>