လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> Multi-Threaded / Multi-process Php 0 န်ဆောင်မှုအတွက် socket_set_block ကိုမှန်ကန်စွာအသုံးပြုခြင်း

Multi-Threaded / Multi-process Php 0 န်ဆောင်မှုအတွက် socket_set_block ကိုမှန်ကန်စွာအသုံးပြုခြင်း

gitbox 2025-05-28

စွမ်းဆောင်ရည်မြင့် PHP ဆာဗာဘေးထွက် 0 န်ဆောင်မှုများကိုတည်ဆောက်ရာတွင်တစ်ပြိုင်နက်တည်းဆက်သွယ်မှုများကိုကိုင်တွယ်ရန်အကြောင်းအရာပေါင်းစုံသို့မဟုတ်ဘက်စုံလုပ်ငန်းစဉ်ပုံစံများကိုအသုံးပြုရန်မကြာခဏလိုအပ်သည်။ Socket Programming သည်ဤရည်မှန်းချက်ကိုအောင်မြင်ရန်အရေးကြီးသောနည်းလမ်းဖြစ်သည်။ သို့သော် socket connection များကိုကိုင်တွယ်သည့်အခါပိတ်ဆို့ခြင်းနှင့်ပိတ်ဆို့ခြင်းမဟုတ်သောချိန်ညှိချက်များသည်သော့ဖြစ်လာသည်။ The socket_set_block() and socket_set_nonblock() functions provided by PHP can be used to control this behavior. သူတို့ကိုအသုံးပြုခြင်းကိုအသုံးပြုခြင်းသည် 0 န်ဆောင်မှုတည်ငြိမ်မှုနှင့်တုန့်ပြန်မှုများကိုပိတ်ဆို့ခြင်း,

ဤဆောင်းပါးသည်ပြ problems နာများကိုပိတ်ဆို့ခြင်းကိုရှောင်ရှားရန် Multi-Php PHP 0 န်ဆောင်မှုတစ်ခုတွင် socket_set_sblock () function ကိုမည်သို့မှန်ကန်စွာအသုံးပြုရမည်,

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

ပုံမှန်အားဖြင့် Socket သည်ပိတ်ဆို့နေသည်။ function_read () သို့မဟုတ် socket_accept_Ack_accept () socket_acception () socket_acception () ကိုပိတ်ဆို့ခြင်း socket တစ်ခုသို့သင်ခေါ်ဆိုသောအခါသို့မဟုတ်ဆက်သွယ်မှုအသစ်မရှိပါကဖုန်းခေါ်ဆိုမှုသည်စိတ်ကျေနပ်မှုမပြည့်မီသည်အထိခေါ်ဆိုမှုသည်စောင့်ဆိုင်းနေလိမ့်မည်။

၎င်းသည်တစ် ဦး တည်းသောချည်မျှင်ပုံစံတွင်ပြ a နာမဟုတ်ပါ, သို့သော်ကလေးချည်ခြင်းသို့မဟုတ်ကလေးငယ်ဖြစ်စဉ်သည်အရင်းအမြစ်များကိုပိတ်ဆို့ခြင်းကြောင့်အရင်းအမြစ်များကိုအချိန်တိုအတွင်းမလွှတ်နိုင်ပါက၎င်းသည်အရင်းအမြစ်များကိုဖြုန်းတီးနိုင်လျှင်အရင်းအမြစ်များကိုဖြုန်းတီးစေနိုင်သည်။

ပိတ်ဆို့ခြင်းမဟုတ်သော socket များမစောင့်ပါ, သူတို့ချက်ချင်းပြန်လာကြ လိမ့် မည် သင်သည်အမှားကုဒ်ကိုရ။ socket_last_Error () မှတဆင့်လုပ်ဆောင်နိုင်သည်။

2 ။ socket_set_sc.block () ကိုမှန်ကန်သောအသုံးပြုမှု၏အချိန်ကိုက်

Socket_set_BLOCK () socket trom socket_set_set_set_set_nonblock () ကိုပိတ်ထားရန်အသုံးပြုနေစဉ် socket ကို socket လုပ်ရန်အသုံးပြုသည်။

Multithreading သို့မဟုတ် Multiprocessing တွင်ပါ 0 င်သည့်နည်းဗျူဟာများမှာ -

  • အဓိကချည်နှောင်ခြင်းသို့မဟုတ်မိဘဖြစ်စဉ်တွင်နားထောင်ခြင်း socket သည်ပိတ်ဆို့ခြင်းကိုလက်ခံခြင်းကိုရှောင်ရှားရန်ပိတ်ဆို့ခြင်း non-blocking mode ကိုမွေးစားသည်။

  • ကလေးချည်သို့မဟုတ်ကလေးဖြစ်စဉ်တွင် client connection တစ်ခုတည်းကိုအပြည့်အဝတောင်းဆိုချက်ဆိုင်ရာယုတ္တိဗေဒကိုပြုပြင်ရန်လွယ်ကူချောမွေ့စေရန် blocking mode သို့ပြောင်းနိုင်သည်။

  • Select () နှင့် stream_seselect () ကိုအသုံးပြုပြီး Event Loops သို့မဟုတ် Modes များတွင် () mode များတွင် (), ပိတ်ဆို့ခြင်းမဟုတ်သော mode ကိုထိန်းသိမ်းရန်အကြံပြုသည်။

3 ။ ဥပမာ - Multi-process PHP 0 န်ဆောင်မှုတွင်လျှောက်လွှာ

ပြ problems နာများကိုပိတ်ဆို့ခြင်းမှရှောင်ရှားရန် Socket_set_Block () ကို မည်သို့မှန်ကန်စွာအသုံးပြုရမည်ကိုပြသသည့် PHP 0 န်ဆောင်မှု၏ဥပမာတစ်ခုမှာဤနေရာတွင်ပြ covere နာများကိုပြသသည်။

<code> & lt; php set_time_limit (0);

$ host = '0.0.0.0';
$ port = 9000;

// Socket ကိုဖန်တီးပါ
$ server = Socket_create (AF_INT, sock_stream, sol_tcp);
Socket_bind ($ server, $ host, $ port);
Socket_listen ($ ဆာဗာ);
Socket_set_nonBlock ($ ဆာဗာ); // အဓိက socket ကိုပိတ်ဆို့ခြင်း mode ကိုသတ်မှတ်ပါ

ECHO "server {$ host}: {$ port} \ n" ကိုစတင်ခဲ့သည်။

နေစဉ် (စစ်မှန်တဲ့) {
$ client = @socket_acceCcept ($ ဆာဗာ);

 if ($client === false) {
    usleep(100000); // ရေှာင်ရှားCPUပျင်းရိသော
    continue;
}

$pid = pcntl_fork();

if ($pid == -1) {
    die("Fork failed\n");
} elseif ($pid == 0) {
    // လက်အောက်ခံ
    socket_close($server); // လက်အောက်ခံ不需要监听Socket

    socket_set_block($client); // client ကိုတက် settingSocketပိတ်ဆို့ mode ကို၌တည်၏

    $input = socket_read($client, 1024);
    $output = strtoupper(trim($input));
    socket_write($client, "You said: $output\n");

    socket_close($client);
    exit(0);
} else {
    // မိဘလုပ်ငန်းစဉ်
    socket_close($client); // မိဘလုပ်ငန်းစဉ်不处理客户端Socket
    pcntl_wait($status, WNOHANG); // ရေှာင်ရှား僵尸进程
}

}
>
</ code>

ဤဥပမာတွင်အဓိကဖြစ်စဉ်သည် connection ကိုစောင့်ဆိုင်းရန်စောင့်ဆိုင်းရန်စောင့်ဆိုင်းနေသော ပိတ်ဆို့ခြင်း non-socket ကိုအသုံးပြုသည်။ ကလေးဖြစ်စဉ်တွင် 0 န်ဆောင်မှုခံယူသူနှင့်အပြန်အလှန်ဆက်သွယ်နေသည့် socket ကိုပိတ်ဆို့ခြင်းသည်ပိတ်ဆို့ခြင်းနှင့်ထုတ်ယူခြင်းကိုအထောက်အကူပြုသည့်အနေဖြင့်ပိတ်ဆို့ခြင်းနှင့်ပိုမိုလွယ်ကူစွာလုပ်ဆောင်ခြင်းကိုလွယ်ကူချောမွေ့စေသည်။

4 ။ နောက်ထပ်အကြံပြုချက်များနှင့်ကြိုတင်ကာကွယ်မှုများ

  1. ပိတ်ပင်တားဆီးမှုနှင့် nonblock ကိုတစ်ချိန်တည်းတွင်အခြား socket ပေါ်တွင် socket လုပ်ရန် nonblock ကိုမထားပါနှင့်။ တာ 0 န် 0 တ္တရားများကိုသတ်မှတ်သည့်လုပ်ငန်းစဉ်များသို့မဟုတ်ချည်များကိုစီမံရန်ပိုမိုလွယ်ကူသည်။

  2. Select () ကိုအသုံးပြုပြီးပိတ်ဆို့ခြင်းမဟုတ်သော socket မျိုးစုံကိုနားထောင်ခြင်းသည် ဖြစ်ရပ်-driven မော်ဒယ်နှင့်ကိုက်ညီရန်ပိုမိုထိရောက်သောနည်းလမ်းဖြစ်သည်။

  3. PHP ၏ stream_socket_ * series function များသည်အချို့သောအခြေအနေများတွင်ဖော်ရွေသော encapsulation များကိုပိုမိုကောင်းမွန်စေသည်

  4. "အရင်းအမြစ်ယာယီမရရှိနိုင်ပါ" ကဲ့သို့သောအမှားကုဒ်များပေါ်လာသည့်အခါမထိတ်လန့်ပါနှင့်။ ၎င်းသည်ပိတ်ဆို့ခြင်းမဟုတ်သောခြေစွပ်များ၏လက္ခဏာများအနက်မှတစ်ခုဖြစ်သည်။

5 ။ အကျဉ်းချုပ်

Socket_set_set_BLOCK () နှင့် Socket_set_set_set_set_setblock () ကိုဆင်ခြင်တုံတရားအသုံးပြုခြင်းသည် PHP ကွန်ရက် 0 န်ဆောင်မှုများကိုတည်ဆောက်ရန်သော့ချက်ဖြစ်သည်။ အထူးသဖြင့်ချည်နှောင်ထားသောသို့မဟုတ်ဘက်စုံသုံးသည့်ပတ်ဝန်းကျင်တွင် 0 ယ်ယူမှုများပြုလုပ်ရန်နှင့်သင့်လျော်သောပိတ်ဆို့ခြင်း modes များကိုချမှတ်ခြင်းသည်ပြ problems နာများကိုပိတ်ဆို့ခြင်းကိုရှောင်ရှားနိုင်ရုံသာမက 0 န်ဆောင်မှုတုံ့ပြန်မှုမြန်နှုန်းနှင့်တည်ငြိမ်မှုကိုလည်းရှောင်ရှားနိုင်သည်။

အထက်ပါဥပမာများနှင့်နည်းဗျူဟာများမှတစ်ဆင့်ဤ sociffion နောက်ခံ 0 န်ဆောင်မှုကိုဖန်တီးရန်အမှန်တကယ်စီမံကိန်းများတွင်ဤ socket function များကိုပိုမိုကောင်းမွန်စွာအသုံးပြုနိုင်သည်ဟုကျွန်ုပ်ယုံကြည်သည်။ အကယ်. သင်သည်ပုဂ္ဂလိက GIT 0 န်ဆောင်မှုတစ်ခုသို့မဟုတ်အချိန်မှန်ဆက်သွယ်ရေးပလက်ဖောင်းကို <code> gitbox.net </ code> ကဲ့သို့သောအချိန်မှန်ဆက်သွယ်ရေးပလက်ဖောင်းတစ်ခုတည်ဆောက်နေပါကတိကျသော Socket Control သည်မရှိမဖြစ်လိုအပ်သည်။