PHP တွင် Socket Programming ကိုအသုံးပြုသောအခါ socket_set_sc.block function ကိုများသောအားဖြင့် socket ကို mode ကိုပိတ်ဆို့ရန်အသုံးပြုသည်။ နောက်ဆက်တွဲဖတ်ရှုခြင်းနှင့်ရေးခြင်းစစ်ဆင်ရေးများသည်ဆက်လက်လုပ်ဆောင်ခြင်းမပြုမီဒေတာပြီးစီးရန် "စောင့်ဆိုင်း" နိုင်လိမ့်မည်ဟုမျှော်လင့်ရသည်။ သို့သော် developer များစွာသည်ပြ the နာကိုကြုံတွေ့ရလိမ့်မည် - Societ_set_set_block ကိုခေါ်ပြီးနောက်ပရိုဂရမ်သည်ပိတ်ဆို့ခြင်းမဟုတ်ဘဲမအောင်မြင်ပါ, ဒါဘာကြောင့်လဲ ဤဆောင်းပါးသည်နောက်ကွယ်မှအကြောင်းပြချက်များကိုနက်နက်ရှိုင်းရှိုင်းခွဲခြမ်းစိတ်ဖြာပြီးသက်ဆိုင်ရာဖြေရှင်းနည်းများပေးလိမ့်မည်။
Socket_set_set_Lock ၏ function သည် socket to blocking mode ကိုဖွင့်ရန် socket တစ်ခုသတ်မှတ်ရန်ဖြစ်သည်။ ၎င်း၏ function ကိုလက်မှတ်ဖြစ်ပါတယ်:
bool socket_set_block ( resource $socket )
ခေါ်ဆိုမှုသည်အောင်မြင်သည်ဆိုပါက စစ်မှန်ပါ ။
သို့သော်မှတ်သားရန်အရေးကြီးသည် -
Socket_set_Block သည်နောက်ခံ society အရင်းအမြစ်အတွက်ပိတ်ဆို့ခြင်း mode တစ်ခုဖြစ်ပြီး၎င်း၏အကျိုးသက်ရောက်မှုသည် socket ၏သတ်သတ်မှတ်မှတ်အခြေအနေပေါ်တွင်မူတည်သည်။
Socket သည်ပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင်ရှိနေပြီးပါက (ဥပမာ, socket_set_set_set_setblock ) ကိုအရင်ဖုန်းခေါ်ဆိုပါက) ပိတ်ဆို့ခြင်း socket_set_block ကို ခေါ်ပြီးနောက်ပြန်လည်စတင်သင့်သည်။
သို့သော် socket ကိုယ်နှိုက်သည်အထူးပြည်နယ် (ဤသို့သောချိတ်ဆက်ထားသည့်သို့မဟုတ်အချို့သော system နောက်ပိုင်းအခြေအနေသို့အခြေအနေသည်) တွင်ပါ 0 င်ပါကပိတ်ဆို့ခြင်း mode ကို setting လုပ်ခြင်းသည်အကျိုးသက်ရောက်မည်မဟုတ်ပါ။
နောက်ခံ socket သည်အခြားကုဒ်များဖြင့်ပိတ်ဆို့ခြင်းမဟုတ်သောပြည်နယ်သို့ပြန်လည်သတ်မှတ်ထားသည်
socket settings များနှင့်ပ conflict ိပက်ခများရှိသည့်အစီအစဉ်တွင်အခြားကုဒ်သို့မဟုတ်မူဘောင်များရှိနိုင်သည်။ ဥပမာအားဖြင့် societ_set_set_block ကို မခေါ်မီအချို့သောစာကြည့်တိုက်များသို့မဟုတ်သတင်းများသည် sociec_set_set_set_setnwork ကို ခေါ်ယူခြင်းနှင့်နောက်ခံစနစ်ခေါ်ဆိုမှုပင်လျှင် socymal property များကိုပင်ပြောင်းလဲစေပြီးမမှန်ကန်သောနောက်ဆက်တွဲခေါ်ဆိုမှုများဖြစ်ပေါ်စေသည်။
Socket Connection သည်အချို့သောပြတ်တောင်းပြတ်တောင်းသို့မဟုတ်အချိန်ကုန်ခြင်းအခြေအနေတွင်ရှိသည်
အချို့သော operating systems သို့မဟုတ် php ဗားရှင်းများတွင် Socket သည်ချိတ်ဆက်မှုရှိပါကသို့မဟုတ်အချိန်ကုန်များဖြစ်ပေါ်နေလျှင် Socket ၏ပိတ်ဆို့ခြင်း mode သည်အကျိုးသက်ရောက်မည်မဟုတ်ပါ။ ဥပမာအားဖြင့်:
ဆက်သွယ်မှုမပြီးဆုံးပါကစာဖတ်ခြင်းနှင့်ရေးခြင်းစစ်ဆင်ရေးများကိုခေါ်ဆိုခြင်းနှင့်ရေးသားခြင်းသည်ပိတ်ဆို့မည်မဟုတ်ပါ။
Non-stated socket အမျိုးအစားများ (ထိုကဲ့သို့သော Unix Domain Socket, SSL SSL Sock Ssl Socke) ကိုမကိုက်ညီပါ။
PHP ဗားရှင်းနှင့် operating system catatibility ပြ issues နာများ
ကွဲပြားခြားနားသော PHP ၏ဗားရှင်းများသည် socket function များကိုအကောင်အထည်ဖော်ခြင်းများအတွက်ကွဲပြားနိုင်သည်။ အထူးသဖြင့် Windows နှင့် Linux ပလက်ဖောင်းများ၏အပြုအမူသည်လည်းကွဲပြားခြားနားသည်။
ခေါ်ဆိုမှု၏မမှန်ကန်ကြောင်းအမိန့်
အကယ်. Socket_set_sc_block ကိုပထမ ဦး ဆုံးဟုခေါ်သည်ဆိုပါက, ပိတ်ဆို့ခြင်း / ပိတ်ဆို့ခြင်းမဟုတ်သောအခြေအနေများကိုနောက်ပိုင်းတွင်ထည့်သွင်းထားသည့်အခြားလုပ်ဆောင်ချက်များကိုနောက်ပိုင်းတွင်ဟုခေါ်တွင်ပါ။
Code တွင်အသုံးပြုသောလုပ်ဆောင်ချက်များကိုသူတို့ကိုယ်သူတို့ပိတ်ဆို့ခြင်းမဟုတ်ပါ
ဥပမာအားဖြင့် Socket_selection သည် ပိတ်ဆို့ခြင်းမဟုတ်သောစီးပွါးရေးလည်ပတ်မှုများကိုအသုံးပြုခြင်းသို့မဟုတ်ပိတ်ဆို့ခြင်းမဟုတ်သောလုပ်ငန်းလည်ပတ်မှုများကိုအသုံးပြုခြင်း,
၎င်းကိုတစ်ကြိမ်သာနှင့်ကျိုးကြောင်းဆီလျော်သောနေရာ၌သာခေါ်ရန်သေချာအောင်လုပ်ပါ
Socket_set_set_block ကိုထည့်သွင်းထားသင့်သည်။ socket ကိုဖန်တီးပြီးအောင်မြင်စွာချိတ်ဆက်ပြီးအောင်မြင်စွာချိတ်ဆက်ထားပြီးနောက်ဆက်တွဲကုဒ်နံပါတ်များကိုမအောင်မြင်စေရန်သေချာစေပါ။
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_block($socket);
အမှားစစ်ဆေးခြင်းနှင့်အတူပေါင်းစပ်
Function Call ခေါ်ဆိုမှုသည် မှန်ကန်မှု ရှိ / မရှိစစ်ဆေးပါ။
if (!socket_set_block($socket)) {
$errorcode = socket_last_error($socket);
$errormsg = socket_strerror($errorcode);
echo "ပိတ်ဆို့ခြင်း setting မအောင်မြင်ပါ: [$errorcode] $errormsg\n";
}
ရောနှောခြင်းမရှိသောလုပ်ဆောင်မှုများကိုမသုံးပါနှင့်
State_set_Block နှင့် Socket_set_set_set_set_set_set_nonblock ကို မရောနှောပါနှင့်။
အစား stream_set_blocking ကိုသုံးပြီးစဉ်းစားပါ
အကယ်. သင်သည် PHP's Stream Encapsulture Socket Socket Socket ကိုအသုံးပြုနေပါကပိတ်ဆို့ခြင်း mode ကိုထိန်းချုပ်ရန် stream_set_blocking ကို သုံးနိုင်သည်။
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
stream_set_blocking($stream, true);
အောက်ပါဥပမာသည်ပိတ်ဆို့ခြင်း socket ကိုစနစ်တကျတည်ဆောက်ရန်နှင့် HTTP တောင်းဆိုမှုကိုမည်သို့ပေးပို့ရမည်ကိုပြသသည်။
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("ဖန်တီးSocketဆုံးရှုံး: " . socket_strerror(socket_last_error()) . "\n");
}
$result = socket_connect($socket, "gitbox.net", 80);
if ($result === false) {
die("连接ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// ပိတ်ဆို့ခြင်း mode ကို set
if (!socket_set_block($socket)) {
die("ပိတ်ဆို့ခြင်း setting မအောင်မြင်ပါ: " . socket_strerror(socket_last_error($socket)) . "\n");
}
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// ဒေတာကိုဖတ်တဲ့အခါလုပ်ကွက်,အကြောင်းအရာကိုလက်ခံရရှိသည်အထိသို့မဟုတ်ဆက်သွယ်မှုကိုပိတ်ထားသည်အထိ
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
echo $response;
socket_close($socket);
Socket_set_set_Set_Block ၏ function သည် socket ကိုပိတ်ဆို့ရန်ဖြစ်သည်။
call socket_set_set_block သည်ပိတ်ဆို့ခြင်းမဟုတ်ကြောင်းပြသနေဆဲဖြစ်သည်။
မှန်ကန်သောချဉ်းကပ်နည်းသည် Setup လုပ်ဆောင်ချက်များကိုပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းကိုမရောနှောခြင်းမှရှောင်ရှားရန် Socket ၏ပိတ်ဆို့ခြင်းလုပ်ငန်းစဉ်ကိုတင်းကြပ်စွာထိန်းချုပ်ရန်ဖြစ်သည်။
အခြေခံ socket နှင့် php ပတ်ဝန်းကျင်၌ကွဲပြားခြားနားမှုများကိုနားလည်ပြီး Debug သတင်းအချက်အလက်နေရာရေးပြ issues နာများကိုပေါင်းစပ်ပါ။
ဤသော့အချက်များကျွမ်းကျင်မှုသည် PHP တွင် Socket blocking blocking blocking blocking ကိုတားဆီးနိုင်ပြီးမမျှော်လင့်သောပြတ်တောင်းပြတ်တောင်းစွမ်းဆောင်ရည်ကိုရှောင်ရှားနိုင်သည်။