<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// အောက်ပါအကြောင်းအရာသည်ဆောင်းပါး၏ခေါင်းစဉ်နှင့်လုံးဝမသက်ဆိုင်ပါ,ကျပန်းဖြစ်နိုင်ပါတယ် PHP Code Page</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">randomGreeting</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$name</span></span></span><span>) {
</span><span><span class="hljs-variable">$greetings</span></span><span> = [</span><span><span class="hljs-string">"Hello"</span></span><span>, </span><span><span class="hljs-string">"Hi"</span></span><span>, </span><span><span class="hljs-string">"Hey"</span></span><span>, </span><span><span class="hljs-string">"Greetings"</span></span><span>];
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$greetings</span></span><span>[</span><span><span class="hljs-title function_ invoke__">array_rand</span></span><span>(</span><span><span class="hljs-variable">$greetings</span></span><span>)] . </span><span><span class="hljs-string">", "</span></span><span> . </span><span><span class="hljs-variable">$name</span></span><span> . </span><span><span class="hljs-string">"!"</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">randomGreeting</span></span><span>(</span><span><span class="hljs-string">"User"</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-comment"># အသုံးပြု `socket_wsaprotocol_info_import` ကြိုးမဲ့လုံခြုံမှုကိုဘယ်လိုသေချာအောင်လုပ်မလဲ?</span></span><span>
မြင့်မားသောတစ်ပြိုင်နက်တည်း network programming ၌တည်၏,အထူးသဖြင့်အတွက် Windows 平台下အသုံးပြု原生 Socket API ဖွံ့ဖြိုးတဲ့အခါ,`socket_wsaprotocol_info_import` ကွဲပြားခြားနားသောချည်သို့မဟုတ်ဖြစ်စဉ်များအကြား socket သတင်းအချက်အလက်မျှဝေနိုင်စွမ်းကိုထောက်ပံ့ပေးသည်。မည်မှျပင်,直接အသုံးပြု该函数可能导致线程安全问题和竞争条件,ထို့ကြောင့်ဘေးကင်းလုံခြုံမှုရှိစေရန်အချို့သောအစီအမံများကိုပြုလုပ်ရမည်。
</span><span><span class="hljs-comment">## 1. နားလည် `socket_wsaprotocol_info_import`</span></span><span>
`socket_wsaprotocol_info_import` ဟုတ်ကဲ့ Windows Socket extension ၏အစိတ်အပိုင်းတစ်ခု,၎င်းသည်သင့်အားအခြားချည်များသို့မဟုတ်လုပ်ငန်းစဉ်များမှဖန်တီးသော socket များကိုတင်သွင်းရန်ခွင့်ပြုသည်。ပုံမှန်အခြေအနေများပါဝင်သည်:
- Multi- ချည်ဆာဗာ,အဓိကချည်သည်စောင့်ကြည့်လေ့လာခြင်းအတွက်တာဝန်ရှိသည်,အလုပ်သမားချည်ကိုင်တွယ်ဆက်သွယ်မှု。
- ဖြစ်စဉ်များကိုဖြတ်ပြီးထူထောင် socket များကိုဝေမျှပါ。
ဒီ mode မှာ,အဘယ်သူမျှမထပ်တူပြုခြင်းယန္တရားရှိလျှင်,Threads သည်တစ်ချိန်တည်းတွင်တူညီသော socket ကိုလည်ပတ်နိုင်သည်,၎င်းသည်ခန့်မှန်းရခက်သောအပြုအမူကိုဖြစ်ပေါ်စေသည်,ဒေတာဆုံးရှုံးခဲ့ရသို့မဟုတ်အစီအစဉ်ပျက်သွားလျှင်。
</span><span><span class="hljs-comment">## 2. ယှဉ်ပြိုင်မှုအခြေအနေများကိုရှောင်ရှားရန်အခြေခံစည်းမျဉ်းများ</span></span><span>
thread ဘေးကင်းလုံခြုံမှုကိုသေချာပါစေ,关键ဟုတ်ကဲ့**တစ်ချိန်တည်းတွင်ချည်တစ်ချောင်းသာ socket အရင်းအမြစ်ကိုအသုံးပြုသည်**。以下ဟုတ်ကဲ့常用方法:
</span><span><span class="hljs-comment">### 2.1 အသုံးပြု互斥锁(Mutex)</span></span><span>
PHP extensions သို့မဟုတ်အခြေခံအလွှာများနှင့်အတူအသုံးပြုနိုင်ပါသည် C/C++ Mutex သော့ခလောက်များ၏ပံ့ပိုးမှု。ယုတ္တိမရှိပါ:
```php
</span><span><span class="hljs-variable">$mutex</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Mutex</span></span><span>(); </span><span><span class="hljs-comment">// သင်ရှိသည်ဟုယူဆ Mutex အတန်းစာများ</span></span><span>
</span><span><span class="hljs-variable">$mutex</span></span><span>-></span><span><span class="hljs-title function_ invoke__">lock</span></span><span>();
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_wsaprotocol_info_import</span></span><span>(</span><span><span class="hljs-variable">$info</span></span><span>);
</span><span><span class="hljs-comment">// စစ်ဆင်ရေး sockets</span></span><span>
</span><span><span class="hljs-variable">$mutex</span></span><span>-></span><span><span class="hljs-title function_ invoke__">unlock</span></span><span>();
</span></span>
ဤအချက်သည်တစ်ချိန်တည်းတွင်တစ်ချိန်တည်းတွင်တစ်ချိန်တည်းတွင် socket ကိုလည်ပတ်စေနိုင်သည်ဟုသေချာစေသည်။
Socket တစ်ခုစီတွင် Windows Kernel တွင်ထူးခြားသောလက်ခဏာတစ်ခုရှိသည်။ အကယ်. Socket ကို Threads မျိုးစုံမှအကြိမ်ကြိမ်တင်သွင်းလျှင်ခန့်မှန်းရခက်သောအပြုအမူပေါ်ပေါက်လာသည်။ အကောင်းဆုံးအလေ့အကျင့်များ
socket တစ်ခုချင်းစီကိုတစ်ကြိမ်သာတင်သွင်းသည်။
Imported Socket Objects ကိုချည်ထားသည့်တန်းစီသို့မဟုတ်ကွန်တိန်နာထဲသို့ထည့်ပါ။
အကယ်. သင်သည်ချည်ပေါင်းစုံသောဝန်းကျင်တွင် Socket Obsces များကိုသိမ်းဆည်းထားပါက,
SPL ၏ SPLAREUE MOUTEX သော့ခတ်ခြင်းနှင့်ပေါင်းစပ်ထားသည်
Custom Thread-Safe Map / Array
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">ThreadSafeSocketQueue</span></span><span> {
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$queue</span></span><span>;
</span><span><span class="hljs-keyword">private</span></span><span> </span><span><span class="hljs-variable">$mutex</span></span><span>;
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable language_">$this</span></span><span>->queue = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">SplQueue</span></span><span>();
</span><span><span class="hljs-variable language_">$this</span></span><span>->mutex = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">Mutex</span></span><span>();
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">push</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$socket</span></span></span><span>) {
</span><span><span class="hljs-variable language_">$this</span></span><span>->mutex-></span><span><span class="hljs-title function_ invoke__">lock</span></span><span>();
</span><span><span class="hljs-variable language_">$this</span></span><span>->queue-></span><span><span class="hljs-title function_ invoke__">enqueue</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-variable language_">$this</span></span><span>->mutex-></span><span><span class="hljs-title function_ invoke__">unlock</span></span><span>();
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">pop</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable language_">$this</span></span><span>->mutex-></span><span><span class="hljs-title function_ invoke__">lock</span></span><span>();
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->queue-></span><span><span class="hljs-title function_ invoke__">isEmpty</span></span><span>() ? </span><span><span class="hljs-literal">null</span></span><span> : </span><span><span class="hljs-variable language_">$this</span></span><span>->queue-></span><span><span class="hljs-title function_ invoke__">dequeue</span></span><span>();
</span><span><span class="hljs-variable language_">$this</span></span><span>->mutex-></span><span><span class="hljs-title function_ invoke__">unlock</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$socket</span></span><span>;
}
}
</span></span>
ချည်ပေါင်းမျိုးစုံဖြင့် socket တစ်ခုနှင့်ချိတ်ဆက်သောအခါ, ချည်မျှင်သည်ပုံမှန်မဟုတ်သောအရာများထွက်ပေါ်လာပါက Socket Resour ကိုထုတ်ပြန်ခြင်းမပြုနိုင်ပါ။ အကြံပြုချက် -
Socket ကိုသော့ဖွင့်ပြီးပိတ်ရန်သေချာအောင်လုပ်ပါ ။ နောက်ဆုံး ။
Socket ကိုသန့်ရှင်းရေးမှတ်ပုံတင်ရန် register_shutdown_function သို့မဟုတ် thread ထွက်ပေါက်ပြန်သွားပါ။
Socket Life Cyleticts ကိုချည်လုပ်ရန် socket life cycle ကိုတင်းတင်းဆုပ်ကိုင်ရန်ကြိုးစားပါ။ ၎င်းသည်ယှဉ်ပြိုင်မှုအခြေအနေများဖြစ်နိုင်ခြေကိုလျှော့ချနိုင်သည်။
Socket_wsaprotocol_info_import ကိုအသုံးပြုပြီး ဘယ်အချိန်မှာလုံခြုံမှုအတွက်သော့ချက်အတွက်သော့ချက်ဖြစ်သည်။
socket တစ်ခုချင်းစီကိုတစ်ကြိမ်သာတင်သွင်းသည်။
Socket Operations ကာကွယ်ရန် Mutex ကိုသုံးပါ။
ချည် - လုံခြုံသောဒေတာတည်ဆောက်ပုံနှင့်အတူ socketets ကိုစီမံခန့်ခွဲ။
ပုံမှန်မဟုတ်သောအခြေအနေများတွင်အရင်းအမြစ်ဖြန့်ချိမှုကိုသေချာစေပါ။
Socket Sharing အတွက်အချိန်ပြတင်းပေါက်ကိုတိုစေဖို့ကြိုးစားပါ။
အထက်ပါနည်းလမ်းဖြင့် Socket_wsaprotocol_info_import ကို Windows Multi-Threaded သို့မဟုတ် Multi-process ကိုပတ်ဝန်းကျင်တွင်အန္တရာယ်ကင်းစွာအသုံးပြုနိုင်ပြီး,
<span></span>