PHP တွင် FPASSTHRU () function ကို function function ကို file pointer မှညွှန်ပြသည့်ဖိုင်ကိုတိုက်ရိုက်ထုတ်လွှင့်ရန်အသုံးပြုသည်။ ဒီ function ကိုသုံးတဲ့အခါမှာတော့ Memory Splflow ပြ problems နာတွေကိုကြုံတွေ့ရနိုင်တယ်, ဤဆောင်းပါးသည်မှတ်ဥာဏ်လျှံပြ problems နာများကိုဖြေရှင်းရန်နှင့်ဖြေရှင်းရန်မည်သို့ဖြေရှင်းနိုင်သည်ကိုမိတ်ဆက်ပေးလိမ့်မည်။
FPASSTHRU () function ၏ function သည် function ၏ function သည် file pointer ကိုညွှန်ပြပြီးဖိုင်ကို browser (သို့) terminal သို့ထုတ်လွှင့်သောလက်ရှိအနေအထားကိုဖတ်ရှုရန်ဖြစ်သည်။ ယေဘုယျအားဖြင့် FPASSTHRU () သည် ဗီဒီယိုစီးဆင်းမှုများ, ရုပ်ပုံများ, မှတ်တမ်းများစသဖြင့် PHP မှထွက်ပေါ်လာသော PHP မှထုတ်လုပ်သော PHP မှထွက်ပေါ်လာသောဖြစ်ရပ်များအတွက်သင့်လျော်သည်။ 4 င်း၏အခြေခံအသုံးပြုမှုမှာအောက်ပါအတိုင်းဖြစ်သည် -
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
အထက်ပါကုဒ်သည်ဖိုင်တစ်ခုဖွင့်ပြီးဖိုင်၏ contents များကို FPASSTHRU () မှတဆင့်ပါ 0 င်သည်။ အကယ်. ဖိုင်သည်ကြီးမားသောသို့မဟုတ်စနစ်ကိုမလျော်ကန်စွာပြင်ဆင်ထားပါက၎င်းသည် output content များကြောင့်မှတ်ဥာဏ်များစွာကြောင့်မှတ်ဥာဏ်လျှံကိုဖြစ်ပေါ်စေနိုင်သည်။
FPASSTHRU () function ကိုသုံးသောအခါမှတ်ဥာဏ်လျှံခြင်းသည်များသောအားဖြင့်အောက်ပါအကြောင်းပြချက်များကြောင့်ဖြစ်သည်။
အကယ်. ဖိုင်သည်ကြီးမားသည်ဆိုပါက PHP သည်ဖိုင်တစ်ခုလုံး၏ contents များကိုဖတ်ရန်နှင့်ထုတ်လုပ်ရန်လိုအပ်သည်။ ကြီးမားသောဖိုင်များအတွက် (1GB အထက်ရှိဖိုင်များကဲ့သို့) တိုက်ရိုက်ထွက်ရှိမှုသည်မှတ်ဥာဏ်များစွာကိုတက်လိမ့်မည်။ PHP မှသတ်မှတ်ထားသောမှတ်ဉာဏ်ကန့်သတ်ချက် ( memory_limimit ) သည်နိမ့်ပါကဖိုင်၏ဖတ်ခြင်းနှင့်ထုတ်လုပ်မှုသည်ခွင့်ပြုထားသောမှတ်ဉာဏ်အကွာအဝေးထက်ကျော်လွန်ပြီးမှတ်ဉာဏ်ပြည့်လျှံနေစေလိမ့်မည်။
PHP တွင် default output buffer ရှိသည်။ ဖိုင်၏ contents များသည်ကြီးမားလွန်းပါကဆိုဒ်သည်အကြောင်းအရာတစ်ခုလုံးကိုကြားခံထဲသို့တင်ရန်ကြိုးစားလိမ့်မည်။ အကယ်. ကြားခံသည်ဤလုပ်ငန်းစဉ်အတွင်းထိုကဲ့သို့သောအချက်အလက်များကိုမကိုင်တွယ်နိုင်ပါက၎င်းသည်မှတ်ဥာဏ်လျှံစေနိုင်သည်။
PHP သည်ဖိုင်ကြီးများကိုအထူးဒီဇိုင်းရေးဆွဲခြင်းအတွက်အထူးသဖြင့် FPASSTHRU () မှတစ်ဆင့် PHP သည် FPASSTHRU () မှထွက်ပေါ်လာသောအခါ PHP သည်ဖိုင်အမျိုးအစားကိုဖတ်ရန်နှင့် output buffer သို့လွှဲပြောင်းရန်ကြိုးစားလိမ့်မည်။ အကယ်. system အရင်းအမြစ်များသို့မဟုတ်ပြင်ဆင်မှုသည်ထိုကဲ့သို့သောမြင့်မားသောဝန်များကိုမထောက်ပံ့နိုင်ပါကမှတ်ဉာဏ်ပြ problems နာများကိုဖြစ်ပေါ်စေသည်။
ပထမ ဦး ဆုံး PHP ၏မှတ်ဉာဏ်ကန့်သတ်ချက်သည်ကြီးမားသောဖိုင်များထုတ်လုပ်မှုကိုကိုင်တွယ်ရန်လုံလောက်မှုရှိမရှိစစ်ဆေးပါ။ PHP.INI ဖိုင်ကိုပြုပြင်ခြင်းဖြင့်မှတ်ဉာဏ်ကန့်သတ်ချက်ကိုတိုးမြှင့်နိုင်သည်။
<span><span><span class="hljs-attr">memory_limit</span></span><span> = </span><span><span class="hljs-number">512</span></span><span>M
</span></span>
PHPP.INI ကို တိုက်ရိုက်မပြုပြင်နိုင်ပါက၎င်းကိုဇာတ်ညွှန်းတွင် dynamally သတ်မှတ်နိုင်သည်။
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'memory_limit'</span></span><span>, </span><span><span class="hljs-string">'512M'</span></span><span>);
</span></span>
မှတ်ဥာဏ်အကန့်အသတ်များတိုးပွားလာသောကြောင့်မှတ်ဥာဏ်မလုံလောက်ခြင်းကြောင့်ဖြစ်ပေါ်လာသောလျှံသောပြ issues နာများကိုရှောင်ရှားရန်ဖြစ်နိုင်သည်။
ဖိုင်တစ်ခုလုံးကိုတစ်ပြိုင်နက်တည်းဖွင့်ရန်ရှောင်ရှားရန် FPASSTHRU () function ကိုအတုံးများနှင့် output လုပ်ခြင်းဖြင့်ဖတ်ရှုရန်အတွက်ဖိုင်များကိုဘွတ်ကင်လုပ်ကွက်များဖြင့်ဖတ်ရှုနိုင်ရန် FPASSTHRU () function ကိုသုံးနိုင်သည်။ ဖိုင်အကြောင်းအရာကို တစ်ဆင့် ပြီးအောင်လုပ်ပြီး ECHO output ကိုသုံးပါ။ ဥပမာများမှာအောက်ပါအတိုင်းဖြစ်သည် -
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">8192</span></span><span>); </span><span><span class="hljs-comment">// တစ်ခုချင်းစီကိုဖတ်ပါ 8KB</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
ဤနည်းလမ်းသည်ဖိုင်တစ်ခုလုံး၏ contents များကိုတစ်ပြိုင်နက်တည်းတင်ခြင်းကိုရှောင်ရှားသည်။ ထို့ကြောင့်ကြီးမားသောဖိုင်များပြုပြင်သည့်အခါမှတ်ဥာဏ်အသုံးပြုမှုကိုသိသိသာသာလျှော့ချနိုင်သည်။
PHP ၏ output buffer သည်မှတ်ဥာဏ်လျှံ၏အကြောင်းရင်းတစ်ခုဖြစ်သည်။ အချက်အလက်အမြောက်အများကိုထုတ်လွှင့်သောအခါ, buffer ကို ob_clean () နှင့် flush မှတဆင့်ထိန်းချုပ်နိုင်သည်။ ဥပမာအားဖြင့်:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_clean</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>();
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span>) {
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">8192</span></span><span>); </span><span><span class="hljs-comment">// တစ်ခုချင်းစီကိုဖတ်ပါ 8KB</span></span><span>
</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>(); </span><span><span class="hljs-comment">// output ကိုကြားခံရှင်းလင်းပါ</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Flush () ကိုအသုံးပြုခြင်းသည်ဒေတာများကို browser သို့ချက်ချင်းပို့ပြီးကြားခံ၌စုဆောင်းထားသောအလွန်အကျွံပါဝင်မှုကိုရှောင်ရှားရန်သေချာစေသည်။
အလွန်ကြီးမားသောဖိုင်များအတွက်ဖိုင်အရွယ်အစားကိုစစ်ဆေးပြီး 0 င်ရောက်ခြင်းမပြုမီ chunking processing လိုအပ်သောလုပ်ဆောင်ရန်လိုအပ်သည်ကိုဆုံးဖြတ်နိုင်သည်။ ဥပမာအားဖြင့်ဖိုင်အရွယ်အစားကိုရယူရန် ဖိုင်များ () function ကို သုံး. ၎င်းကိုအပိုင်းအစများတွင်လုပ်ဆောင်သည်ကိုဆုံးဖြတ်နိုင်သည်။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$file_path</span></span><span> = </span><span><span class="hljs-string">'largefile.txt'</span></span><span>;
</span><span><span class="hljs-variable">$file_size</span></span><span> = </span><span><span class="hljs-title function_ invoke__">filesize</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file_size</span></span><span> > </span><span><span class="hljs-number">1000000000</span></span><span>) { </span><span><span class="hljs-comment">// ဖိုင်ထက်ပိုကြီးလျှင် 1GB</span></span><span>
</span><span><span class="hljs-comment">// chunking အပြောင်းအလဲနဲ့လုပ်ဆောင်ပါ</span></span><span>
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// တိုက်ရိုက်အသုံးပြုပါ fpassthru()</span></span><span>
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
အလွန်ကြီးမားသောဖိုင်များအတွက် streaming Technipres များကို PHP မှဖိုင်တစ်ခုလုံးကိုဖတ်ရှုခြင်းနှင့်ထုတ်လွှင့်ခြင်းထက် HTTP ခေါင်းစီးများထက်ဖိုင်များကိုတိုက်ရိုက်လွှဲပြောင်းခြင်းကဲ့သို့သော HTTP ခေါင်းစီးများပေါ်တွင်တိုက်ရိုက်လွှဲပြောင်းခြင်းစသည်တို့ကိုအကြံပြုသည်။ သင့်လျော်သော HTTP header ကိုအောက်ပါကုဒ်ကို အသုံးပြု. သတ်မှတ်နိုင်သည်။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: application/octet-stream'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Disposition: attachment; filename="largefile.txt"'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Length: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">filesize</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>));
</span><span><span class="hljs-title function_ invoke__">readfile</span></span><span>(</span><span><span class="hljs-string">'largefile.txt'</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
ဤနည်းလမ်းသည် File Contents များကို PHP Memory ထဲသို့တင်ရန်မလိုအပ်ပါ။ သို့သော် Hard disk မှတိုက်ရိုက် streaming လုပ်ခြင်း,
ကြီးမားသောဖိုင်အသစ်အတွက် PHP အပြင် FFMPEG ကဲ့သို့သောကြီးမားသောဖိုင်များ (ဗီဒီယိုဖိုင်များ) သို့မဟုတ် imagemagick ကဲ့သို့သောကြီးမားသောဖိုင်များ (သို့) imagemagick ကဲ့သို့သောကိရိယာများသို့မဟုတ်စာကြည့်တိုက်အချို့ကို အသုံးပြု. ဖိုင်များသို့မဟုတ်စာကြည့်တိုက်အချို့ကိုအသုံးပြုရန်စဉ်းစားနိုင်သည်။ မှတ်ဥာဏ်လျှံကိုရှောင်ရှားရန်အတွက်ဤကိရိယာများကိုနောက်ခံတွင်ထုတ်လွှင့်နိုင်သည်။
FPASSTHRU () function သည်အဆင်ပြေသော်လည်းကြီးမားသောဖိုင်များပြုပြင်ပြောင်းလဲသည့်အခါ၎င်းသည်မှတ်ဥာဏ်လျှံကိုအလွယ်တကူဖြစ်ပေါ်စေနိုင်သည်။ ဤပြ problem နာကိုရှောင်ရှားရန်မှတ်ဉာဏ်ကန့်သတ်ချက်များကိုညှိနှိုင်းခြင်း, ဖိုင်များကိုပိတ်ဆို့ခြင်း, ဤနည်းလမ်းများမှတစ်ဆင့်မှတ်ဉာဏ်ပြည့်လျှံပြ problems နာများကိုထိရောက်စွာရှောင်ရှားနိုင်ပြီးလျှောက်လွှာ၏တည်ငြိမ်မှုနှင့်စွမ်းဆောင်ရည်ကိုတိုးတက်အောင်လုပ်နိုင်သည်။