PHP 7.4 နှင့်အထက်တွင် FFI (နိုင်ငံခြား function interface) သည် developer များအား C ဘာသာစကားပြောင်းလဲနေသောစာကြည့်တိုက်များဟုခေါ်ဆိုရန်အစွမ်းထက်သောလုပ်ငန်းဆောင်တာများဖြင့်ပေးသည်။ သို့သော် FFI :: load နည်းလမ်းကိုအသုံးပြုသည့်အခါ .ffi ဖိုင်များကိုဖွင့်ရန်သို့မဟုတ် devernic စာကြည့်တိုက်များကိုတိုက်ရိုက်တင်ပါ။
ဤဆောင်းပါးသည်ဤအမှား၏အကြောင်းရင်းများကိုနက်နက်နဲနဲလေ့လာသုံးသပ်ပြီးပြ problem နာကိုလျင်မြန်စွာရှာဖွေရန်နှင့်ထိရောက်သောဖြေရှင်းနည်းများပေးရန်မိတ်ဆက်ပေးလိမ့်မည်။
undefined သင်္ကေတ အမှားဆိုသည်မှာ dynamic link စာကြည့်တိုက်ကိုဖွင့်သောအခါ dynamic link စာကြည့်တိုက်ကိုဖွင့်သောအခါဘုံပြ problem နာတစ်ခုဖြစ်သည်။ Linked Dynamic Libnic စာကြည့်တိုက်သည် FFI ကို အသုံးပြု. C လုပ်ဆောင်ချက်များကိုခေါ်ဆိုသည့်အခါအမှတ်အသားများသို့မဟုတ်သင်္ကေတအမည်များမတူပါကဤအမှားအယွင်းရှိသည်။
ဥပမာအားဖြင့်, အမှားမက်ဆေ့ခ်ျကိုကြည့်ကောင်းလိမ့်မယ်:
PHP Warning: FFI::load(): Unable to load dynamic library or symbol: undefined symbol: my_function
ဆိုလိုသည်မှာ My_FUNTIRED သင်္ကေတကို dynamic library တွင်မတွေ့ရဟုဆိုလိုသည်။
Dynamic Library Target သင်္ကေတပျောက်ဆုံးနေ သင်ခေါ်ဆိုရန်ကြိုးစားနေသည့် C function ကို dynamic library ထဲသို့မသွင်းပါ, သို့မဟုတ်အမည်ကို compiler (c ++ အမည်ပြောင်းခြင်း) ကိုပြန်လည်ရေးသည်။
Dynamic Library မှီခိုမှုမတင်ပါ Dynamic Libraries ဟုခေါ်သော Myanmar Dynamic Libraries များပေါ်တွင်မူတည်သည်။
သင်္ကေတအမည်ရေးသားခြင်းအမှား <br> <br> သင်္ကေတအမည်ကို .ffi ကြေငြာချက်ဖိုင်သို့မဟုတ် FFI ခေါ်ဆိုမှုကုဒ်တွင်စာလုံးပေါင်းသည်။
Dynamic စာကြည့်တိုက်လမ်းကြောင်းအမှားသို့မဟုတ်ဗားရှင်းမတိုက်ဆိုင် <br> <br> loaded dynamic စာကြည့်တိုက်ဗားရှင်းနှင့်ကုဒ်မျှော်လင့်ချက်သည်ကိုက်ညီမှုမရှိပါ။
ပလက်ဖောင်းကွဲပြားခြားနားမှုနှင့်စုစည်းခြင်းရွေးချယ်မှုများ <br> ဥပမာအားဖြင့်, Linux နှင့် Windows များတွင်သင်္ကေတပို့ကုန်နည်းလမ်းများသည်ကွဲပြားခြားနားသည်။
Unix ကဲ့သို့သောစနစ်များတွင် dynamic library တွင်သတ်မှတ်ထားသောသင်္ကေတပါမလားဆိုတာကြည့်ရှုရန် NM command ကိုသုံးနိုင်သည်။
nm -D /path/to/libexample.so | grep my_function
output မရှိပါကသင်္ကေတမရှိပါ။
အကယ်. output output ကိုသို့မဟုတ်အမည်မဖော်လိုသောပြင်ဆင်ခြင်းနှင့်အတူ၎င်းသည် C ++ အမည်ပြုပြင်ခြင်းပြ problem နာဖြစ်နိုင်သည်။
ပြောင်းလဲနေသောစာကြည့်တိုက်သည်ပြောင်းလဲနေသောအခြားစာကြည့်တိုက်များမှာမူတည်သည်ကိုအတည်ပြုပါ။
ldd /path/to/libexample.so
မှီခိုရှာ မတွေ့မ ရှိမရှိစစ်ဆေးပါ။ မှီခိုမှုမရှိခြင်းသည်သင်္ကေတကိုမဖြေရှင်းနိုင်ပါ။
ကြေငြာထားသော function name, parameter type အမျိုးအစားနှင့်ပြန်လာတန်ဖိုးများသည်မှန်ကန်ပြီးပြောင်းလဲနေသောစာကြည့်တိုက်ရှိသင်္ကေတများနှင့်တစ်ခုကတ ဦး တည်းနှင့်ကိုက်ညီကြောင်းသေချာပါစေ။
လုပ်ဆောင်ချက်များကိုပါ 0 င်သောပြောင်းလဲနေသောစာကြည့်တိုက် libmaryath.so ရှိသည်ဆိုပါစို့။
// math.h
int add(int a, int b);
// math.ffi
int add(int a, int b);
<?php
// ကြေငြာချက်ဖိုင်ကို load လုပ်ပြီး dynamic စာကြည့်တိုက်ကိုချိတ်ဆက်ပါ
$ffi = FFI::cdef(
file_get_contents('math.ffi'),
"gitbox.net/libs/libmath.so"
);
$result = $ffi->add(3, 4);
echo "3 + 4 = $result\n";
URL ရှိဒိုမိန်းအမည်ကို GitBox.net ဖြင့်အစားထိုးသည်ကိုသတိပြုပါ။
Dynamic Library ပို့ကုန်သင်္ကေတကို အတည်ပြု ပါ ။
Dynamic Library Loading Path ကိုအတည်ပြုပါ ။ လမ်းကြောင်းမှန်ကိုသေချာအောင်လုပ်ပါ, ဖိုင်တည်ရှိပြီးခွင့်ပြုချက်မှန်ကန်သည်။
C ++ အမည်ပြုပြင်ခြင်းကိုစစ်ဆေးပါ ။ အကယ် . စာကြည့်တိုက်သည် C ++ ဖြစ်ပါက, ပြောင်းလဲခြင်းကိုရှောင်ရှားရန်ပို့ကုန်လုပ်ဆောင်မှုကိုပြုပြင်ရန် Export function ကိုအသုံးပြုပါ။
မှီခိုစာကြည့်တိုက်ကိုတင်ခြင်း - မှီခိုနေစာကြည့်တိုက်ရှိလျှင် မူတည်. မှီခိုမှုပေးထားသောစာကြည့်တိုက်ကို ဦး စွာတင်ပါသို့မဟုတ်ပတ် 0 န်းကျင် variable ကို ဦး စွာတင်ပါ။
undefined သင်္ကေတ အမှားသည်အဓိကအားဖြင့်သင်္ကေတကိုပြောင်းလဲခြင်းစာကြည့်တိုက်တွင်မတွေ့ရပါသို့မဟုတ် 0 င်ရန်ပျက်ကွက်ခြင်းကြောင့်ဖြစ်သည်။ ပြ the နာကိုနေရာချရန်သော့ချက်မှာ -
Dynamic Library သင်္ကေတသင်္ကေတများကိုစစ်ဆေးရန် System Tools များကိုသုံးပါ။
ကြေငြာချက်နှင့် Code သင်္ကေတအမည်အတိအကျကိုက်ညီမှုကိုအတည်ပြုပါ။
ပြောင်းလဲနေသောစာကြည့်တိုက်သည် compiles နှင့်ပို့ကုန်သင်္ကေတများကိုမှန်ကန်စွာသေချာစွာစစ်ဆေးပါ။
ပလက်ဖောင်းကွဲပြားခြားနားမှုနှင့်ပတ်ဝန်းကျင်ပြင်ဆင်မှုကိုအာရုံစိုက်ပါ။
ဤနည်းလမ်းများမှတစ်ဆင့် FFI :: Load မှတင်ပြသော undefined သင်္ကေတ အမှားကိုလျင်မြန်စွာရှာဖွေပြီးဖြေရှင်းနိုင်ပြီး Cynamic စာကြည့်တိုက် function ကိုအောင်မြင်စွာခေါ်ဆိုနိုင်သည်။