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

ဝေးလံသောအိမ်ရှင်များနှင့် Socket_create ချိတ်ဆက်သောအခါကြုံတွေ့ရသည့်ဘုံပြ problems နာများမှာအဘယ်နည်း။ ဘယ်လိုဖြေရှင်းမလဲ

gitbox 2025-09-21

2 ။ Firewall / Network Policy ကိုပိတ်ဆို့ခြင်း (ဒေသခံသို့မဟုတ်သက်တူရွယ်တူ)

: ဆက်သွယ်မှုသည်အချိန်ကြာမြင့်စွာငြင်းပယ်ခြင်းသို့မဟုတ်အချိန်ကြာမြင့်စွာအချိန်ယူသည်, ဆိပ်ကမ်းကိုလက်လှမ်းမမှီပါ။
အကြောင်းရင်း - ဇာတိသို့မဟုတ်သက်တူရွယ်တူ Firewall (Iptables, UFW, Cloud Vendor Security Group) သည်ဆိပ်ကမ်းသို့မဟုတ်အလယ်အလတ် nat / acl လုပ်ကွက်များကိုပိတ်ဆို့ထားသည်။
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :

  • Telnet Host Port / NC -vz Port / Curl Port / Curl Port / Curl - Curl-timeout ကို သုံးပါ။

  • Cloud Platform လုံခြုံရေးအဖွဲ့, ITTables Host Dostabally နှင့် Firewall မှတ်တမ်းများကိုလက်ခံပါ။

  • ဖွင့်လှစ်ခြင်းစည်းမျဉ်းများ (လိုအပ်သော IP / ports များကိုသာဖွင့်လှစ်ထားသည့် IP / ports) ကိုဖွင့်ရန်သို့မဟုတ်ထည့်ပါ။ သို့မဟုတ်လုံခြုံရေးအုပ်စု၏မူဝါဒများကိုညှိပါ။

  • ISP / Computer Room မှကန့်သတ်ထားပါကကွန်ယက်အုပ်ချုပ်ရေးမှူးကိုဆက်သွယ်ပါသို့မဟုတ်ထွက်ပေါက်ကိုပြောင်းလဲပါ။


သုံး - အချိန်ကုန်ခြင်း (ပိတ်ဆို့ခြင်း / ပိတ်ဆို့ခြင်းနှင့်အချိန်ကုန်ခြင်းနှင့်အချိန်ကုန်ခြင်း)

ဖြစ်ရပ် - အချိန်ကြာမြင့်စွာအပြီး socket_connect ပျက်ကွက်ခြင်းသို့မဟုတ် script ကိုပိတ်ဆို့ထားသည်။
အကြောင်းရင်း - ပုံမှန်ပိတ်ဆို့ခြင်းအပြုအမူကိုမသတ်မှတ်နိုင်ပါ။ ဝေးလံခေါင်သီသောအဆုံးသည်တုံ့ပြန်ခြင်းသို့မဟုတ်တုန့်ပြန်မှုနှေးကွေးသည်။
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :

  • ပိတ်ဆို့ခြင်းမဟုတ်သောဆက်သွယ်မှုကို သုံး. သင်ကိုယ်တိုင်စစ်ဆေးနေပါ, သို့မဟုတ် stream_socket_client ကို သုံး. tightout parameter ကိုသုံးပါ။
    PHP Sockets ဥပမာ (Set Timeout):

     <span><span><span class="hljs-variable">$sock</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_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
    @</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$sock</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-variable">$start</span></span><span> = </span><span><span class="hljs-title function_ invoke__">time</span></span><span>();
    </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>;
    </span><span><span class="hljs-keyword">while</span></span><span> (!@</span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$sock</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-variable">$err</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</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">$err</span></span><span> === SOCKET_EISCONN) </span><span><span class="hljs-keyword">break</span></span><span>;
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">time</span></span><span>() - </span><span><span class="hljs-variable">$start</span></span><span> &gt; </span><span><span class="hljs-variable">$timeout</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">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">Exception</span></span><span>(</span><span><span class="hljs-string">"connect timeout"</span></span><span>);
        }
        </span><span><span class="hljs-title function_ invoke__">usleep</span></span><span>(</span><span><span class="hljs-number">100000</span></span><span>);
    }
    </span><span><span class="hljs-title function_ invoke__">socket_set_block</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
    </span></span>
  • Simpler: stream_socket_client ("TCP: // host: port", $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno, $ errno ,


လေး - ခွင့်ပြုချက်နှင့် Selinux / Apparmor ကန့်သတ်ချက်များ

ဖြစ်ရပ် - ဇာတ်ညွှန်းသည်ပြင်ပဆက်သွယ်မှုများကိုမဖွင့်နိုင်ပါ။ မှတ်တမ်းတွင်ကွန်ယက်အမှားများမရှိပါ။
အကြောင်းရင်း - Selinux (သို့) Apparmor သည် Network Network Access ကိုကန့်သတ်ထားသည်။ သို့မဟုတ် PHP-FPM ၏ open_basedir / disable လုပ်ပါ။
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :

  • ငြင်းပယ်ခံရသော entries များရှိမရှိစစ်ဆေးရန် /Var/Log/audit/audit.log (Selinux) သို့မဟုတ် system look ကိုစစ်ဆေးပါ။

  • ခွင့်ပြုထားသောစနစ်ဖြင့်ယာယီစစ်ဆေးပါသို့မဟုတ် 0 န်ဆောင်မှုအတွက်သင့်လျော်သော Selinux မူဝါဒများကိုထည့်ပါ။

  • PHP configuration သည်ကွန်ယက်နှင့်သက်ဆိုင်သောလုပ်ဆောင်မှုများကိုမပိတ်နိုင်ကြောင်းအတည်ပြုပါ


V: protocol / port mismatch ကို TCP / UDP နှင့်ရောနှောထားသည်

ဖြစ်ရပ်ဆန်း - ဆက်သွယ်မှုသည်အောင်မြင်သော်လည်းမည်သည့်တုံ့ပြန်မှုမျှမရှိသေးပါ။
အကြောင်းပြချက် - ပစ်မှတ် 0 န်ဆောင်မှုသည် UDP ကိုအသုံးပြုသည်။ သို့သော် client သည် TCP ကိုအသုံးပြုသည်။ protocol အဆင့် (ထိုကဲ့သို့သော tls ကိုမျှော်လင့်နေသော်လည်းတိုက်ရိုက် TCP) ။
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :

  • 0 န်ဆောင်မှုသဘောတူညီချက် (HTTP / HTTPS, TLS, SMTP, Redis, MySQL စသည်) သည် connection method နှင့်ကိုက်ညီကြောင်းအတည်ပြုပါ။

  • အကယ်. ၎င်းသည် TLS / SSL ဖြစ်ပါက stream_socket_client ('SSL: // host: port', port ', port', ... ) ကိုသုံးပြီးသို့မဟုတ် sockets ပေါ်တွင် Openssl Extraction Stream_sockePocable_crypto () ကိုသုံးပါ။


ခြောက်: IPv6 / IPv4 လိပ်စာမိသားစုပြ issues နာများ

ဖြစ်ရပ် - အိမ်ရှင်တွင် IPv4 နှင့် IPv6 နှစ်ခုလုံးတွင်ရှိသည်။
ဖြေရှင်းရန် :

  • AF_INT (IPV4) သို့မဟုတ် af_inet6 (IPv6) ကိုအတိအလင်းသုံးပါ။

  • တိကျသောလိပ်စာကိုရယူရန် GetAddrinfo သို့မဟုတ် DNS_GEGGECOUCOR () ကိုသုံးပါ, ပြီးနောက်သင့်လျော်သောမိသားစုကိုရွေးချယ်ပါ။


SSL / TLS လက်ဆွဲနှုတ်ဆက်ခြင်းမအောင်မြင်ပါ (လက်မှတ်, SNI, Cipher Suite)

ဖြစ်ရပ်ဆန်း - ဆက်သွယ်မှုကိုစတင်တည်ထောင်ထားပေမယ့်လက်ဆွဲနှုတ်ဆက်ခြင်းကပျက်ကွက်ခြင်းနှင့် OpenSSL အမှားတစ်ခုဖြစ်ပေါ်လာသည်။
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :

  • stream_socket_client_client ကိုသုံးပါ ('SSL: // port', $ errno, $ dress_client_connect, stream_client_client_connect , ဥပမာ -

     <span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
        </span><span><span class="hljs-string">'ssl'</span></span><span> =&gt; [
            </span><span><span class="hljs-string">'verify_peer'</span></span><span> =&gt; </span><span><span class="hljs-literal">true</span></span><span>,
            </span><span><span class="hljs-string">'cafile'</span></span><span> =&gt; </span><span><span class="hljs-string">'/etc/ssl/certs/ca-certificates.crt'</span></span><span>,
            </span><span><span class="hljs-string">'SNI_enabled'</span></span><span> =&gt; </span><span><span class="hljs-literal">true</span></span><span>,
            </span><span><span class="hljs-string">'peer_name'</span></span><span> =&gt; </span><span><span class="hljs-string">'example.com'</span></span><span>,
        ]
    ]);
    </span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"ssl://example.com:443"</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">5</span></span><span>, STREAM_CLIENT_CONNECT, </span><span><span class="hljs-variable">$context</span></span><span>);
    </span></span>
  • Openssll ဗားရှင်းနှင့်ဆာဗာ - ထောက်ပံ့သော cipher suites များကိုကြည့်ရှုခြင်းနှင့်လိုအပ်ပါက suite ကိုအဆင့်မြှင့်ပါ။

  • လက်မှတ်ကွင်းဆက်ပြီးဆုံးသည် (အလယ်အလတ်လက်မှတ်ပျောက်ဆုံးခြင်းသည်လက်ဆွဲနှုတ်ဆက်ခြင်းကိုပျက်ပြားစေလိမ့်မည်) စစ်ဆေးပါ။


8. အရင်းအမြစ်ကန့်သတ်ချက် (Descriptor, Concurent Connection အထက်)

ဖြစ်ရပ် - မြင့်မားသောတစ်ကမ္ဘာန်တွေ့လက်အောက်တွင်ဆက်သွယ်မှုမအောင်မြင်ပါ။
အကြောင်းမရှိ : System Elimit -n သို့မဟုတ်လုပ်ငန်းစဉ်အမြင့်ဆုံး open-files limit ကို။
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :

  • လက်ရှိကန့်သတ်ချက်ကိုကြည့်ရန် Elimit -n ကို သုံးပါ။ ကန့်သတ်ချက်တိုးမြှင့်ဖို့ system / service configuration /limits.conf ကိုချိန်ညှိပါ။

  • ပရိုဂရမ်တွင်ဆက်သွယ်မှုများ (connection pools) ကိုပြန်လည်အသုံးပြုပြီးတစ်ပြိုင်နက်တည်း sockets အရေအတွက်ကိုလျှော့ချရန် asynchronous / even-driven-model ကိုသုံးပါ။


9. မလုံလောက်ခြင်းအမှားအယွင်းကင်းစွာကိုင်တွယ်ခြင်း (အထူးအမှားကုဒ်နံပါတ်မလုံလောက်ခြင်း)

ဖြစ်ရပ်ဆန်း - "connection မအောင်မြင်" ကိုသာသိသော်လည်းအကြောင်းပြချက်ကိုမသိသောကြောင့်ဖြစ်သည်။
ဖြေရှင်းရန် :

  • အသေးစိတ်အမှားအချက်အလက်များရရန် Socket_Last_Error () နှင့် Socket_Stror () () နှင့် socket_strerror () ကို သုံးပါ။

     <span><span><span class="hljs-variable">$err</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
    </span><span><span class="hljs-variable">$msg</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$err</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"socket error: <span class="hljs-subst">$err</span></span></span><span> - </span><span><span class="hljs-subst">$msg</span></span><span>");
    </span></span>
  • အခြေအနေကို (Port, Port, Timeout Time) ကိုဖမ်းယူခြင်းနှင့်မှတ်တမ်းတင်ခြင်း (target log and timeout အချိန်), system log နှင့် tcpdump ခွဲခြမ်းစိတ်ဖြာခြင်းပေါင်းစပ်ခြင်း။


ဆယ် - အလယ်အလတ် proxy / transparent proxy / nat ပြုပြင်မွမ်းမံသည့်အသွားအလာ

ဖြစ်ရပ်ဆန်း - ပြင်ပကွန်ယက်ကိုဆက်သွယ်ခြင်းပေမယ့်အပြုအမူသည်ပုံမှန်မဟုတ်သော (တောင်းဆိုမှုများကိုကြားဖြတ်ခြင်း,
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :

  • Agents (လုပ်ငန်းကွန်ယက်, ISP) သို့မဟုတ် waf သည်ကွန်ယက်လမ်းကြောင်းတွင်ရှိမရှိမရှိအတည်ပြုပါ။

  • TCP သုံးကြိမ်လက်ဆွဲနှုတ်ဆက်ခြင်းနှင့်နောက်ဆက်တွဲ packets များကို ပြုပြင် မွမ်းမံခြင်း,

  • proxy တစ်ခုရှိပါက authentication ကိုထည့်ပါသို့မဟုတ် proxy လိုအပ်ချက်များအရ proxy channel သို့သွားပါ။


11: အဆင့်မြင့် APIs ကိုအသုံးပြုခြင်းသည်ပိုမိုရိုးရှင်းသောနှင့် ပို. ယုံကြည်စိတ်ချရသောဖြစ်သည်

မိခင် socketets အစွမ်းထက်ပေမယ့်ရေးသားဖို့ပိုပြီးရှုပ်ထွေးဖြစ်ကြသည်။ ဘုံ TCP / HTTP / SSL အခြေအနေများအတွက် ဦး စားပေးပေးပါသည်။

  • stream_socket_client () : Built-in Timeout သည် SSL // ကိုတိုက်ရိုက်ပံ့ပိုးပေးနိုင်သည်။

  • curl (libcurl) extension: HTTP / HTTPS အတွက်သင့်တော်သောရွေးချယ်စရာများနှင့်အချိန်ကုန်ချိန်ညှိချက်များနှင့်သင့်တော်သည်။

  • သီးသန့် 0 န်ဆောင်မှုခံယူသူ၏စာကြည့်တိုက်များ (Redis, MySQL, AMQP, စသည်တို့) သည်များသောအားဖြင့်အသေးစိတ်အချက်အလက်များနှင့်ကိုက်ညီသည်။

ဥပမာ - stream_socket_clies ကို သုံး. ဖတ်ရန်နှင့်ရေးရန်ရေးရန်

 <span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>;
</span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:12345"</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-variable">$timeout</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$fp</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"connect failed: <span class="hljs-subst">$errno</span></span></span><span> </span><span><span class="hljs-subst">$errstr</span></span><span>");
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>, </span><span><span class="hljs-string">"hello\n"</span></span><span>);
    </span><span><span class="hljs-variable">$resp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
}
</span></span>

Debugging နှင့်ရောဂါသိကောင်းစရာများ (လက်တွေ့စာရင်း)

  1. ဒေသခံ Ping / Dig / Telnet / NC သည် အခြေခံဆက်သွယ်မှုကိုအတည်ပြုရန်ပထမ ဦး ဆုံး။

  2. PHP တွင် socket_last_error နှင့် socket_stror ကို ပုံနှိပ်ပါ။

  3. သုံးလမ်းခရီးသည်အောင်မြင်မှုရှိ,

  4. connection တောင်းဆိုမှုသို့မဟုတ်ငြင်းပယ်ခံရမှုကိုလက်ခံရရှိမလားဆိုတာကြည့်ဖို့ server log (access) ကိုစစ်ဆေးပါ။

  5. server firewall (Iptables / Nftablishes, Cloud Security Group), Selinux မူဝါဒများနှင့် PHP-FPM ခွင့်ပြုချက်။

  6. ကွန်ယက်ထွက်ပေါက်ပြ issues နာများကိုဖြေရှင်းရန်အခြားအိမ်ရှင်တစ် ဦး သို့မဟုတ်ကွန်ယက်အစိတ်အပိုင်းတစ်ခုပေါ်တွင်အခြား host ကိုချိတ်ဆက်ပါ။

  7. အကယ်. ၎င်းသည် TLS ပြ problem နာဖြစ်လျှင် OpenSSL S_CLIENT -CLIENT -CCOMENED HOMS: handshake အသေးစိတ်အချက်အလက်များရရန် port -servername host