လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Socket_set_block နှင့် Socket_set_set_set_set_set_nonBlock အကြားပြောင်းနည်း

Socket_set_block နှင့် Socket_set_set_set_set_set_nonBlock အကြားပြောင်းနည်း

gitbox 2025-05-29

PHP, Socket_set_set_block () နှင့် socket_set_set_set_set_set_set_set_set_setblock ()) ကိုအသုံးပြုသော Programming Networks () သည်အလွန်အရေးကြီးသောလုပ်ဆောင်ချက်နှစ်ခုသည်အလွန်အရေးကြီးသောလုပ်ဆောင်ချက်နှစ်ခုဖြစ်သည်။ ကျိုးကြောင်းဆီလျော်သောဤ mode နှစ်ခုကိုပြောင်းလဲခြင်းသည်ကွန်ယက် I / O ကိုပိုမိုပြောင်းလွယ်ပြင်လွယ်စွာကိုင်တွယ်နိုင်ပြီးပရိုဂရမ်များထိရောက်မှုနှင့်တုန့်ပြန်မှုကိုတိုးတက်စေသည်။

ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော modes အကြားခြားနားချက်

Blocking Mode (Default): ဤစနစ်တွင်ဤ mode တွင် socket operations ( socket_read), socket_accept () , socket_accept () , စသည်တို့) သည်ဒေတာကိုဖတ်လို့မရလျှင်စောင့်ဆိုင်းလိမ့်မည်။ ဤနည်းလမ်းသည်ရေးရန်ရိုးရှင်းပါသည်။

ပိတ်ဆို့ခြင်းမဟုတ်သော mode: ပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင်အပြန်အလှန်ဆက်သွယ်မှုများကိုအပြန်အလှန်ဆက်သွယ်မှုသည်ချက်ချင်းပြန်လာလိမ့်မည်။ အကယ်. စစ်ဆင်ရေးကိုချက်ချင်းမဖြည့်နိုင်ပါက (ဖတ်ရန်အချက်အလက်မရှိပါက) function ကိုပြန်ပို့သည် EAGAY သို့မဟုတ် EWOOLDBLOCK မှအမှားကုဒ်ကိုသတ်မှတ်သည်။

မှန်ကန်စွာအသုံးပြုရန်ပြောင်းနည်း?

ပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော sockets များကိုပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမရှိသောနေရာများအကြားမည်သို့ကူးပြောင်းပြီး၎င်းတို့ကို application scarious နှင့်ပေါင်းစပ်ညှိနှိုင်းရန်မည်သို့ပြောင်းလဲနိုင်ကြောင်းပြသသည့်ရိုးရှင်းသောဥပမာတစ်ခုဖြစ်သည်။

 <?php
$host = 'gitbox.net';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() failed: " . socket_strerror(socket_last_error()));
}

// Non-blocking mode ကိုသတ်မှတ်ပါ,ချိတ်ဆက်ရန်ကြိုးစားပါ
socket_set_nonblock($socket);

$connected = @socket_connect($socket, $host, $port);
if (!$connected) {
    $err = socket_last_error($socket);
    if ($err !== SOCKET_EINPROGRESS && $err !== SOCKET_EALREADY) {
        die("socket_connect() failed: " . socket_strerror($err));
    }
}

// အသုံးပြု select ဆက်သွယ်မှုအောင်မြင်မှုရှိမရှိစစ်ဆေးပါ
$write = [$socket];
$null = [];
if (socket_select($null, $write, $null, 5) > 0) {
    // blocking mode ကိုပြန်သွားပါ,နောက်ဆက်တွဲဒေတာထုတ်လွှင့်ခြင်းနှင့် reception ည့်ခံများအတွက်အသုံးပြုခဲ့သည်
    socket_set_block($socket);

    // ဒေတာများကိုပေးပို့ခြင်းနှင့်လက်ခံခြင်းစတင်ပါ
    socket_write($socket, "GET / HTTP/1.1\r\nHost: $host\r\n\r\n");
    $response = socket_read($socket, 2048);
    echo "Response: " . $response;
} else {
    die("Connection timeout or failed");
}

socket_close($socket);
?>

ရှင်းပြပါ -

  1. ပိတ်ဆို့ခြင်းမဟုတ်သောဆက်သွယ်မှု - Socket_set_setonBlock () ကို အသုံးပြု. ပရိုဂရမ်ကွပ်မျက်မှုကိုပိတ်ဆို့ခြင်းမှကာကွယ်ရန်။

  2. Socket_select () Socket ကို Writcher လုပ်ရန်စောင့်ဆိုင်းပါ - ဤသည်ဆက်သွယ်မှုအောင်မြင်မှုရှိ,

  3. Blocking Mode သို့ပြန်သွားရန် socket_set_set_block () ကိုနှိပ်ပြီးနောက်ဆက်တွဲအချက်အလက်အပြန်အလှန်ဆက်သွယ်မှုကိုလွယ်ကူချောမွေ့စေရန်တည်ဆောက်ပြီးသည်နှင့်ချက်ချင်းပိတ်ထားခြင်း Mode သို့ပြန်သွားရန်။

  4. တောင်းဆိုမှုနှင့်ဖတ်ရှုခြင်းအားဖတ်ပါ ။ ဤအချိန်တွင် socket သည် server response ၏စာဖတ်ခြင်းကိုလွယ်ကူချောမွေ့စေသည့်ပိတ်ဆို့ခြင်း mode တွင်အလုပ်လုပ်သည်။

ဘယ်အချိန်မှာ mode ကိုပြောင်းရမလဲ။

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

  • အချို့သောစစ်ဆင်ရေးတစ်ခုသည်အချိန်ကုန်ဆုံးထိန်းချုပ်မှုကဲ့သို့သောအတိုင်းအလိုတွင်မစောင့်နိုင်အောင်သေချာစေရန်လိုအပ်သည်။

  • ဆက်သွယ်မှုတစ်ခုသို့မဟုတ်တိကျသောအဆင့်ကိုဖြည့်စွက်ပြီးပါက code processing logic ကိုရိုးရှင်းစေရန်ပိတ်ဆို့ခြင်း mode ကိုပိတ်ပါ။

မှတ်သားရန်အရာ

  • ပိတ်ဆို့ခြင်းမဟုတ်သော mode တွင် socket operations အားလုံးသည်အမှားစစ်ဆေးခြင်းကိုစစ်ဆေးရမည်။

  • Socket_select () သည်ပိတ်ဆို့ခြင်း non-blocking socket programming တွင်အဓိကကိရိယာတစ်ခုဖြစ်သည်။

  • static ဖြစ်ခြင်းထက် switching mode ကိုစစ်ဆင်ရေးအဆင့်အရလုပ်ဆောင်သင့်သည်။

အားဖြည့်ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သော modes များကိုပြောင်းလဲခြင်းဖြင့် PHP Socket Programming သည်စွမ်းဆောင်ရည်စွမ်းဆောင်ရည်နှင့်တည်ငြိမ်မှုကိုထည့်သွင်းစဉ်း စား. မရပါ။