လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> byte-byte စာဖတ်ခြင်းကိုအကောင်အထည်ဖော်ရန် Socket_set_Block ဖြင့် socket_block ဖြင့်အသုံးပြုပါ

byte-byte စာဖတ်ခြင်းကိုအကောင်အထည်ဖော်ရန် Socket_set_Block ဖြင့် socket_block ဖြင့်အသုံးပြုပါ

gitbox 2025-05-29

PHP တွင် PHP, Socket Extensions ရှိပရိုဂရမ်များကွန်ယက်များသည် developer များကိုအောက်ခြေရှိကွန်ယက်ဆက်သွယ်မှုများကိုထိန်းချုပ်နိုင်စွမ်းရှိစေသည်။ ၎င်းတို့အနက် Socket_set_set_block နှင့် Socket_read_reads သည် synchronous စာဖတ်ခြင်းကိုအကောင်အထည်ဖော်ရန်အဓိကလုပ်ဆောင်ချက်များဖြစ်သည်။ အကယ်. သင်၏ရည်မှန်းချက်သည် Socket byte byte မှဒေတာများကိုဖတ်ရှုရန်ဆိုလျှင်စိတ်ကြိုက် protocol ကိုအကောင်အထည်ဖော်ခြင်းသို့မဟုတ် streaming data processing ယန္တရားကိုအသုံးပြုခြင်းကိုနားလည်ရန်အထူးအရေးကြီးသည်။

Socket The Blocking mode ကိုဖွင့်ရန် socket_set_sclock function ကိုအသုံးပြုရန် Socket_set_block function ကို အသုံးပြု. Socket_read နှင့်ပူးပေါင်းဆောင်ရွက်ရန် Socket_read နှင့်ပူးပေါင်းရန် Socket_read နှင့်ပူးပေါင်းရန်အသေးစိတ်ရှင်းပြပါလိမ့်မည်။

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

PHP Socket Programming တွင် Socketets များသည်ပိတ်ဆို့ခြင်းသို့မဟုတ်ပိတ်ဆို့ခြင်းကိုပိတ်ဆို့ခြင်းဖြစ်နိုင်သည်။ ပိတ်ဆို့ခြင်း mode တွင် socket_read ကဲ့သို့သောလုပ်ဆောင်ချက်တစ်ခုကိုခေါ်ဆိုသည့်အခါအချက်အလက်မဖတ်နိုင်ပါကအချက်အလက်မရောက်မချင်းအစီအစဉ်ကို "ပိတ်ဆို့" လိမ့်မည်။ ဤပုံစံသည်အချက်အလက်များကိုနောက်ဆက်တွဲလုပ်ဆောင်နေသည့်အခြေအနေများနှင့် bytes အားဖြင့်စာဖတ်ခြင်းယန္တရားကိုအကောင်အထည်ဖော်ရန်လွယ်ကူချောမွေ့စေသည်။

Socket ကိုပိတ်ဆို့ခြင်း mode ကိုသတ်မှတ်ရန်အောက်ပါ function ကိုသုံးနိုင်သည်။

 socket_set_block($socket);

ပုံမှန်အားဖြင့်အသစ်စက်စက်ဖန်တီးထားသော socketets များသည်ပိတ်ဆို့ခြင်းဖြစ်သော်လည်းတသမတ်တည်းသောအပြုအမူများကိုသေချာစေရန်၎င်းကိုစာမဖတ်မီတစ်ကြိမ်ရှင်းလင်းစွာခေါ်ဆိုရန်အကြံပြုသည်

Socket_read ကိုဘယ်လိုသုံးရမလဲ

Socket_read သည် Socket မှအချက်အလက်များကိုဖတ်သော PHP တွင်လုပ်ဆောင်ချက်တစ်ခုဖြစ်သည်။ ရှေ့ပြေးပုံစံသည်အောက်ပါအတိုင်းဖြစ်သည် -

 socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false

အတွက်

  • $ Socket သည် Connections နှင့်ဆက်သွယ်ထားသော socket အရင်းအမြစ်တစ်ခုဖြစ်သည်။

  • $ အရှည်သည် ဖတ်ရန် Bytes အရေအတွက်ကိုကိုယ်စားပြုသည်။

  • $ type ကို များသောအားဖြင့် php_binary_read ကို အသုံးပြု. binary safe way တွင်ဖတ်ရန်အသုံးပြုသည်။

ဒေတာ byte byte ကိုဖတ်ချင်ရင် $ အရှည်ကို 1 အထိသတ်မှတ်နိုင်ပါတယ်။

 $byte = socket_read($socket, 1);

ပိတ်ဆို့ခြင်း mode မှာ function ကိုအနည်းဆုံး byte ကိုဖတ်လို့မရတဲ့အထိစောင့်ဆိုင်းလိမ့်မယ်။

လက်တွေ့ကျကျကုဒ်ဥပမာ - Remote ဆာဗာဒေတာကို byte ဖြင့်ဖတ်ပါ

ဝေးလံခေါင်သီသောဆာဗာတစ်ခုသို့ဆက်သွယ်သောရိုးရှင်းသောဥပမာတစ်ခု ( GitPox.net ကို ဥပမာတစ်ခုအဖြစ်ယူပြီး) ကိုဖတ်ပြီးသည်အထိတုန့်ပြန်မှုအချက်အလက်များကို byte byte မှဖတ်သည်။

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

// ဖန်တီး socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() ဆုံးရှုံး: " . socket_strerror(socket_last_error()) . "\n");
}

// ဝေးလံသောအိမ်ရှင်နှင့်ဆက်သွယ်ပါ
if (!socket_connect($socket, $host, $port)) {
    die("socket_connect() ဆုံးရှုံး: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// mode ကိုပိတ်ဆို့ဖို့သတ်မှတ်ထားပါ
socket_set_block($socket);

// ရိုးရှင်းပါ HTTP မေးမြန်း
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// တုံ့ပြန်မှု byte byte ကိုဖတ်ပါ,အသစ်တစ်ခုကိုဇာတ်ကောင်ကြုံတွေ့သည်အထိ
$response = '';
while (true) {
    $byte = socket_read($socket, 1);
    if ($byte === false || $byte === '') {
        break;
    }
    $response .= $byte;
    if ($byte === "\n") {
        break;
    }
}

// တုံ့ပြန်မှု၏ပထမ ဦး ဆုံးလိုင်း output ကိုဖတ်ပါ
echo "ပထမ ဦး ဆုံးလိုင်းတုံ့ပြန်:\n" . $response;

// ဆက်သွယ်မှုကိုပိတ်ပါ
socket_close($socket);
?>

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

  1. စွမ်းဆောင်ရည်အကျိုးသက်ရောက်မှု - Byte-byte စာဖတ်ခြင်းသည်စနစ်ခေါ်ဆိုမှုများပိုမိုများပြားလာလိမ့်မည်။ ထို့ကြောင့်အချက်အလက်ပမာဏကြီးမားသည့်အခါစွမ်းဆောင်ရည်သည်အကျိုးသက်ရောက်နိုင်သည်။ အကယ်. သင်သည်အချို့သောပုံစံကိုဖတ်လိုပါက (အသစ်သောအဆင့်အထိ) ကိုဖတ်လိုပါကသင့်တင့်သောစာဖတ်ခြင်းအရှည်ကို ဦး စွာသတ်မှတ်ပြီး strows () ကိုသုံးနိုင်သည်။

  2. အက်ခရာ Encoding Encoding ပြ problem နာ : Socket_read သည် မူလ binary data ကိုပြန်ပို့သည်။

  3. Connection TimeOut : ပိတ်ဆို့ခြင်း mode မှာ server ကိုအချိန်ကြာကြာမတုံ့ပြန်ဘူးဆိုရင်ဒီပရိုဂရမ်က socket_read မှာရပ်သွားလိမ့်မယ်။ Read Timeout ကို socket_set_option နှင့်ပေါင်းစပ်ထည့်သွင်းစဉ်းစားပါ။

အကျဉ်းချုပ်

Socket_set_set_Set_block မှတဆင့် socket_set_block မှတဆင့် socket_read ကိုပိတ်ထားပြီးနောက် Socket_read ကို တစ်ချိန်တည်းတွင်ဖတ်ရန် Socket_read ကိုဖတ်ရန် socket_read ကို အသုံးပြု. အကျင့်စာရိတ္တ protocol ကိုတည်ဆောက်ရန်သင့်လျော်သည်။ ဤနည်းလမ်းသည်စွမ်းဆောင်ရည်မြင့်မားသောအခြေအနေများတွင်မလုံလောက်သေးသော်လည်းတည်ငြိမ်ပြီးထိန်းချုပ်နိုင်သောဒေတာ stream အပြောင်းအလဲအတွက်လိုအပ်သောအခါ၎င်းသည်အလွန်လက်တွေ့ကျသောနည်းလမ်းတစ်ခုဖြစ်နေဆဲပင်။

ဤနည်းပညာဖြင့် PHP ၏စွမ်းဆောင်ရည်ကိုဆာဗာ - ဘေးထွက်ဆက်သွယ်ရေးတွင် PHP ၏စွမ်းရည်ကိုချဲ့ထွင်ရန်အတွက် PHP တွင်ပိုမိုရှုပ်ထွေးသောကွန်ယက်ဆက်သွယ်မှုဆိုင်ရာယုတ္တိဗေဒကိုအကောင်အထည်ဖော်နိုင်သည်။