လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP တွင် C-Language ဖွဲ့စည်းပုံအခင်းအလွဲမိတ္တူကူးခြင်း FFI :: Memtpy အကဲဖြတ်ခြင်း

PHP တွင် C-Language ဖွဲ့စည်းပုံအခင်းအလွဲမိတ္တူကူးခြင်း FFI :: Memtpy အကဲဖြတ်ခြင်း

gitbox 2025-06-06

1 ။ သဘာဝပတ်ဝန်းကျင်ပြင်ဆင်မှု

သင်၏ PHP တပ်ဆင်မှုသည် FFI extension ကိုသေချာအောင်လုပ်ပါ။ PHPP.INI ဖိုင်ကိုပြုပြင်ပြီးအောက်ပါ configuration ကိုထည့်နိုင်သည်။

 ffi.enable=1

နောက်တစ်ခုက C တည်ဆောက်ပုံဆိုင်ရာအဓိပ္ပါယ်ဖွင့်ဆိုချက်တစ်ခုလိုအပ်ပါတယ်။

 typedef struct {
    int id;
    float value;
} Item;

ကျွန်ုပ်တို့သည်ဤဖွဲ့စည်းပုံကို PHP တွင် C ကြေငြာစာတမ်းမှတစ်ဆင့်သတ်မှတ်ပြီးအဆောက်အအုံများကိုတပ်ဆင်ထားသည်။


2 ။ PHP တွင်ဖွဲ့စည်းပုံကိုကြေငြာရန် FFI ကိုသုံးပါ

 $ffi = FFI::cdef("
    typedef struct {
        int id;
        float value;
    } Item;

    void *memcpy(void *dest, const void *src, size_t n);
", "libc.so.6"); // Linux ဆင်းလျက် libc လမ်းကြောင်း,Windows ဆင်းလျက်可能需要改为 "msvcrt.dll"

3 ။ ဖွဲ့စည်းပုံခင်းကျင်းကိုဖန်တီးပြီး၎င်းကိုအစပြုပါ

ကျွန်ုပ်တို့သည်အဆောက်အအုံများကိုဖန်တီးပြီးဒြပ်စင်များစွာကိုအစပြုပေးသည်။

 $length = 3;
$items1 = $ffi->new("Item[$length]");

$items1[0]->id = 1;
$items1[0]->value = 3.14;

$items1[1]->id = 2;
$items1[1]->value = 2.71;

$items1[2]->id = 3;
$items1[2]->value = 1.62;

4 ။ ဖွဲ့စည်းပုံ arrays ကူးယူရန် FFI :: MemcPy ကိုသုံးပါ

ပထမ ဦး ဆုံးပစ်မှတ်ခင်းကျင်းမှုအတွက်မှတ်ဥာဏ်ကို ဦး စွာခွဲဝေချထားပေးရန်လိုအပ်ပြီးမှတ်ဉာဏ်ကူးရေးရန် Memcpy ကို သုံးပါ။

 $items2 = $ffi->new("Item[$length]");

// bytes ၏စုစုပေါင်းအရေအတွက်ကိုတွက်ချက်ပါ:တစ်ခုချင်းစီကိုဖွဲ့စည်းပုံ၏အရွယ်အစားအရေအတွက်ကမြှောက်သည်
$size = FFI::sizeof($items1);

// အသုံးပြု memcpy မှတ်ဉာဏ်ကူးယူပါ
$ffi->memcpy(FFI::addr($items2[0]), FFI::addr($items1[0]), $size);

V. မိတ္တူရလဒ်များကိုစစ်ဆေးပါ

 for ($i = 0; $i < $length; $i++) {
    echo "Item {$i}:\n";
    echo "  ID: " . $items2[$i]->id . "\n";
    echo "  Value: " . $items2[$i]->value . "\n";
}

output ကိုအောက်ပါအတိုင်းဖြစ်သင့်သည် -

 Item 0:
  ID: 1
  Value: 3.14
Item 1:
  ID: 2
  Value: 2.71
Item 2:
  ID: 3
  Value: 1.62

6 ။ မှတ်စုဖို့အရာ

  1. Memcpy ကို ပစ်မှတ်ထားသောမှတ်ဉာဏ် area ရိယာကိုလုံလောက်သောနေရာချထားရန်သေချာစေရန် bytes ဖြင့်ကူးယူထားသည်။

  2. FFI :: SPASSOFF သည် byte အရွယ်အစားကိုခင်းကျင်းခြင်းဖြင့်သိမ်းပိုက်ရန်လုံခြုံစွာအသုံးပြုနိုင်သည်။

  3. PHP FFI ကုဒ်ကို script ခေါ်ဆိုမှုများမှတဆင့် PHP FFI ကုဒ်ကိုအသုံးပြုလိုပါက PHPFI.ENCASE ကို အသုံးပြုရန်သတိရပါ။

  4. အချို့သောပလက်ဖောင်းများတွင် (MACOS သို့မဟုတ် Windows ကဲ့သို့သော) တွင် CDEF တွင် CDEF ရှိစာကြည့်တိုက်အမည်ကိုအမှန်တကယ်လမ်းကြောင်းအတိုင်းပြုပြင်ရန်လိုအပ်သည်။