: ဆက်သွယ်မှုသည်အချိန်ကြာမြင့်စွာငြင်းပယ်ခြင်းသို့မဟုတ်အချိန်ကြာမြင့်စွာအချိန်ယူသည်, ဆိပ်ကမ်းကိုလက်လှမ်းမမှီပါ။
အကြောင်းရင်း - ဇာတိသို့မဟုတ်သက်တူရွယ်တူ 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> > </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 သည် Network Network Access ကိုကန့်သတ်ထားသည်။ သို့မဟုတ် PHP-FPM ၏ open_basedir / disable လုပ်ပါ။
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :
ငြင်းပယ်ခံရသော entries များရှိမရှိစစ်ဆေးရန် /Var/Log/audit/audit.log (Selinux) သို့မဟုတ် system look ကိုစစ်ဆေးပါ။
ခွင့်ပြုထားသောစနစ်ဖြင့်ယာယီစစ်ဆေးပါသို့မဟုတ် 0 န်ဆောင်မှုအတွက်သင့်လျော်သော Selinux မူဝါဒများကိုထည့်ပါ။
PHP configuration သည်ကွန်ယက်နှင့်သက်ဆိုင်သောလုပ်ဆောင်မှုများကိုမပိတ်နိုင်ကြောင်းအတည်ပြုပါ ။
ဖြစ်ရပ်ဆန်း - ဆက်သွယ်မှုသည်အောင်မြင်သော်လည်းမည်သည့်တုံ့ပြန်မှုမျှမရှိသေးပါ။
အကြောင်းပြချက် - ပစ်မှတ် 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 () ကိုသုံးပါ။
ဖြစ်ရပ် - အိမ်ရှင်တွင် IPv4 နှင့် IPv6 နှစ်ခုလုံးတွင်ရှိသည်။
ဖြေရှင်းရန် :
AF_INT (IPV4) သို့မဟုတ် af_inet6 (IPv6) ကိုအတိအလင်းသုံးပါ။
တိကျသောလိပ်စာကိုရယူရန် GetAddrinfo သို့မဟုတ် DNS_GEGGECOUCOR () ကိုသုံးပါ, ပြီးနောက်သင့်လျော်သောမိသားစုကိုရွေးချယ်ပါ။
ဖြစ်ရပ်ဆန်း - ဆက်သွယ်မှုကိုစတင်တည်ထောင်ထားပေမယ့်လက်ဆွဲနှုတ်ဆက်ခြင်းကပျက်ကွက်ခြင်းနှင့် 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> => [
</span><span><span class="hljs-string">'verify_peer'</span></span><span> => </span><span><span class="hljs-literal">true</span></span><span>,
</span><span><span class="hljs-string">'cafile'</span></span><span> => </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> => </span><span><span class="hljs-literal">true</span></span><span>,
</span><span><span class="hljs-string">'peer_name'</span></span><span> => </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 ကိုအဆင့်မြှင့်ပါ။
လက်မှတ်ကွင်းဆက်ပြီးဆုံးသည် (အလယ်အလတ်လက်မှတ်ပျောက်ဆုံးခြင်းသည်လက်ဆွဲနှုတ်ဆက်ခြင်းကိုပျက်ပြားစေလိမ့်မည်) စစ်ဆေးပါ။
ဖြစ်ရပ် - မြင့်မားသောတစ်ကမ္ဘာန်တွေ့လက်အောက်တွင်ဆက်သွယ်မှုမအောင်မြင်ပါ။
အကြောင်းမရှိ : System Elimit -n သို့မဟုတ်လုပ်ငန်းစဉ်အမြင့်ဆုံး open-files limit ကို။
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :
လက်ရှိကန့်သတ်ချက်ကိုကြည့်ရန် Elimit -n ကို သုံးပါ။ ကန့်သတ်ချက်တိုးမြှင့်ဖို့ system / service configuration /limits.conf ကိုချိန်ညှိပါ။
ပရိုဂရမ်တွင်ဆက်သွယ်မှုများ (connection pools) ကိုပြန်လည်အသုံးပြုပြီးတစ်ပြိုင်နက်တည်း sockets အရေအတွက်ကိုလျှော့ချရန် asynchronous / even-driven-model ကိုသုံးပါ။
ဖြစ်ရပ်ဆန်း - "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 ခွဲခြမ်းစိတ်ဖြာခြင်းပေါင်းစပ်ခြင်း။
ဖြစ်ရပ်ဆန်း - ပြင်ပကွန်ယက်ကိုဆက်သွယ်ခြင်းပေမယ့်အပြုအမူသည်ပုံမှန်မဟုတ်သော (တောင်းဆိုမှုများကိုကြားဖြတ်ခြင်း,
ပြ ubl နာဖြေရှင်းခြင်းနှင့် resolution :
Agents (လုပ်ငန်းကွန်ယက်, ISP) သို့မဟုတ် waf သည်ကွန်ယက်လမ်းကြောင်းတွင်ရှိမရှိမရှိအတည်ပြုပါ။
TCP သုံးကြိမ်လက်ဆွဲနှုတ်ဆက်ခြင်းနှင့်နောက်ဆက်တွဲ packets များကို ပြုပြင် မွမ်းမံခြင်း,
proxy တစ်ခုရှိပါက authentication ကိုထည့်ပါသို့မဟုတ် proxy လိုအပ်ချက်များအရ proxy channel သို့သွားပါ။
မိခင် 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>ဒေသခံ Ping / Dig / Telnet / NC သည် အခြေခံဆက်သွယ်မှုကိုအတည်ပြုရန်ပထမ ဦး ဆုံး။
PHP တွင် socket_last_error နှင့် socket_stror ကို ပုံနှိပ်ပါ။
သုံးလမ်းခရီးသည်အောင်မြင်မှုရှိ,
connection တောင်းဆိုမှုသို့မဟုတ်ငြင်းပယ်ခံရမှုကိုလက်ခံရရှိမလားဆိုတာကြည့်ဖို့ server log (access) ကိုစစ်ဆေးပါ။
server firewall (Iptables / Nftablishes, Cloud Security Group), Selinux မူဝါဒများနှင့် PHP-FPM ခွင့်ပြုချက်။
ကွန်ယက်ထွက်ပေါက်ပြ issues နာများကိုဖြေရှင်းရန်အခြားအိမ်ရှင်တစ် ဦး သို့မဟုတ်ကွန်ယက်အစိတ်အပိုင်းတစ်ခုပေါ်တွင်အခြား host ကိုချိတ်ဆက်ပါ။
အကယ်. ၎င်းသည် TLS ပြ problem နာဖြစ်လျှင် OpenSSL S_CLIENT -CLIENT -CCOMENED HOMS: handshake အသေးစိတ်အချက်အလက်များရရန် port -servername host ။