PHP, Socket_Accept () ကို အသုံးပြု. socket-based server applications များရေးသားသောအခါ client connection များကိုလက်ခံရရှိရန်သော့ချက်ဖြစ်သည်။ သို့သော်အချို့သောအခြေအနေများတွင်ပရိုဂရမ်ယုတ္တိဗေဒမှန်ကန်မှုရှိလျှင်ပင် socket_accept () သည် ပုံမှန်အားဖြင့်ဆက်သွယ်မှုကိုမရနိုင်ပါ။ ဤဆောင်းပါးသည်ဤပြ problem နာကိုလျင်မြန်စွာရှာဖွေရန်နှင့်ဖြေရှင်းရန် ကြိုး နှင့် NetStat tools များကိုမည်သို့အသုံးပြုရမည်ကိုဤဆောင်းပါးကရှင်းပြပါမည်။
အောက်ဖော်ပြပါသည် Port 8080 ကိုနားထောင်သည့်ရိုးရှင်းသော PHP server program တစ်ခုဖြစ်သည်။
<?php
$host = '0.0.0.0';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Server listening on $host:$port\n";
while (true) {
$client = socket_accept($socket);
if ($client === false) {
echo "Failed to accept connection\n";
continue;
}
$msg = "Hello from server\n";
socket_write($client, $msg, strlen($msg));
socket_close($client);
}
?>
Socket_Accept () မှားယွင်းသော () အစဉ်အလာကိုသင်တွေ့သောအခါ () အစဉ်အမြဲပြန်ပို့သောအခါ, Depth troubleshooting လုပ်ရန် System Tools များကိုအသုံးပြုရန်လိုအပ်သည်။
Statre သည် Linux အောက်ရှိ System Call ခြေရာခံကိရိယာတစ်ခုဖြစ်သည်။ မည်သည့် system နောက်ခံလုပ်ဆောင်ချက်များကို Runtime တွင် PHP scripts များနှင့်၎င်းတို့၏ကွပ်မျက်မှုရလဒ်များကမည်သည့် system ကိုအခြေခံလုပ်ဆောင်ချက်များကိုခေါ်ယူနိုင်သနည်း။
PS ကိုအသုံးပြုပြီး php process pid ကိုရှာပါ။
ps aux | grep php
လုပ်ငန်းစဉ်နှင့်တွဲရန် ပြင်ဆင်မှုကို သုံးပါ။
strace -p <PID> -e trace=network
အောက်ပါအပြုအမူသည် output တွင်ရှိ, မရှိကိုသတိပြုပါ။
လက်ခံခြင်း (... ) = -1 : စနစ်ခေါ်ဆိုမှုသည်ပုံမှန်အားဖြင့် EAGAY , EANONABPOGECED ကဲ့သို့သောအမှားကုဒ်များနှင့်အတူလိုက်ပါသွားသည်။
နားထောင်ပါ (... ) သို့မဟုတ် bind (... ) အမှား - port ကိုသိမ်းပိုက်ထားသည့်သို့မဟုတ်ခွင့်ပြုချက်မလုံလောက်ကြောင်းဆိုလိုသည်
လက်ခံရန်ခေါ်ဆိုမှုမရှိပါ () - ပရိုဂရမ်သည်အခြားနေရာများတွင်ထည့်သွင်းနိုင်သည်
အကယ်. အကြိုးပြင်ဆင်မှု ကို လက်ခံသည် () သည်ပုံမှန်ဖြစ်သော်လည်းဆက်သွယ်မှုမရှိပါကပြ the နာသည် Network layer သို့မဟုတ် firewall တွင်ပြ problem နာဖြစ်နိုင်သည်။
NetStat နှင့် SS တို့သည် port ကိုနားထောင်နေသည့်ပြည်နယ်တွင်ရှိပြီးဆက်သွယ်မှုတစ်ခုရှိမရှိစစ်ဆေးရန်အသုံးပြုနိုင်သည်။
netstat -tlnp | grep :8080
သို့မဟုတ်:
ss -tlnp | grep :8080
အောက်ပါနှင့်ဆင်တူ output များကိုသင်ကြည့်ရှုနိုင်သင့်သည်။
tcp LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("php",pid=12345,fd=3))
နားထောင်ခြင်းမရှိလျှင် Socket_bind () သို့မဟုတ် Socket_listen () ပျက်ကွက်ခြင်းမရှိလျှင်,
နားထောင်ခြင်းသည်ပုံမှန်ဖြစ်လျှင်ဆက်သွယ်မှုမရှိပါက client သည် connection ကိုမစတင်ခဲ့ခြင်းသို့မဟုတ် firewall မှကြားဖြတ်ခြင်းမရှိပါ။
အကယ်. status သည် close_wait သို့မဟုတ် time_wait ဖြစ်ပါက connection life cycle သည်ပုံမှန်မဟုတ်သောကြောင့်ဖြစ်သည်။
အမှားမက်ဆေ့ခ်ျကိုစစ်ဆေးပါ Sococke Call (Socket_Sarter_Error ()) ကိုနှိပ်ပြီး societ_stror outror (socket_last_error ()) ကို သုံးပါ။
firewall သို့မဟုတ် selinux ကန့်သတ်ချက်များ <br> Port 8080 ကိုပိတ်ဆို့ခြင်းမခံရကြောင်းအတည်ပြုရန် Iptables သို့မဟုတ် Firewalld ကို သုံးပါ။
ဆိပ်ကမ်းကိုအခြားပရိုဂရမ်များကသိမ်းပိုက်ထားသည် LSOF -i: 8080 ကို သုံးပါ။