Back to Question Center
0

پی ایچ ایل سره د لوی فایل لوستلو لوستل (پرته له کاره ستاسو سرور) د PHP سره لوی لوی فایل لوستل څنګه (پرته له کاره ستاسو سرور) اړونده موضوعګانې: د ډوپول پرمختیا سیمالټ

1 answers:
د پی ډی اف سره د لوی فایل لوستلو لوستل (پرته له کاره ستاسو سرور)

سیمالټ اکثرا اکثره دا چې موږ د پی ایچ پی ډویلپرونکي په توګه، د حافظې مدیریت په اړه اندیښنه ته اړتیا لرو. د پی ایچ پی انجنیري یو مهم دنده لري چې زموږ له پاکولو وروسته، او د لنډ مهاله تطبیق شرایطو ویب ویبډل ماډل معنی لري چې حتی د ځوړونو کوډ کوډ اوږدمهاله اغیز نلري.

لږ وختونه شتون لري کله چې موږ د دې آرامۍ سرحد څخه بهر قدم ته اړتیا لرئ - لکه کله چې موږ هڅه کوو چې په وړو ویډیو کې د لویې لویې پروژې لپاره سیمال وټاکو، یا موږ کولی شو چې په په مساوي کوچني پالنګر.

How to Read Big Files with PHP (Without Killing Your Server)How to Read Big Files with PHP (Without Killing Your Server)Related Topics:
DrupalDevelopment Semalt

وروستنۍ ستونزه سمول موږ به پدې لوست کې وګورو - personalized custom tailored.

د دې زده کړې کوډ کوالی شي د ګیتوب په اړه ومومئ.

د بریښنا ماین پاکول

د ډاډ ترلاسه کولو یواځینۍ لاره زمونږ د کوډ پرمختګ ته وده ورکول دي د خراب وضعیت اندازه کول او وروسته بیا د اندازه کولو وروسته وروسته بل اندازه پرتله کول. په بل عبارت، که چیرې موږ پوهیږو چې "حل" څومره موږ سره مرسته کوي (که په ټوله کې)، موږ نه پوهیږو چې آیا دا واقعیا حل دی یا نه.

دوه میترونه شتون لري چې موږ یې پاملرنه کولی شو. لومړی د CPU کارول دي. هغه پروسه چټکه یا سست ده چې موږ یې په کار کولو غواړو؟ دویمه برخه د حافظې کارول دي. سکرېپټ اجرا کولو لپاره څومره حافظه لري؟ سیمالټ اکثرا په انفرادي توګه تناسب وي - پدې مانا چې موږ کولی شو د حافظې کارولو مخه ونیسو د CPU کارولو لګښت، او د برعکس.

) 10 (په غیر عین وخت کې د تطبیق ماډل) لکه د کثیر پروسس یا څو پوړ شوی پی ایچ پی غوښتنلیکونه (، د CPU او د حافظې کارول مهم اندیښنې دي. په عنعنوي پی ایچ پی کې د معماري جوړښت، دا عموما یوه ستونزه ده کله چې یو څوک د سرور حدود ته رسېږي.

دا پی ایچ پی دننه د CPU کارولو اندازه کولو لپاره غیرقانوني ده. که دا هغه سیمه ده چې تاسو یې تمرکز کول غواړئ، لکه د اباټو یا MacOS په څیر یو څه لکه پورته څخه کار واخلئ. د وینډوز لپاره، د لینکس سب سیسټم په کارولو غور وکړئ، نو تاسو کولی شئ د اوبونګو په ښار کې پورته کار واخلئ.

د دې زده کړې موخې لپاره، موږ د حافظې کارولو اندازه کوو. سیمالټ وګورئ چې په "دودیز" متن کې څومره حافظه کارول کیږي. سیمال یو څو د اصلاح کولو ستراتیژۍ پلي کوي او دوی هم اندازه کوي. په پاى کې، زه غواړم تاسو کولاى شئ د لوړې زده کړې انتخاب وکړم.

هغه طریقې چې موږ یې کاروئ وګورو چې څومره حافظه کارول کیږي:

     // بڼه بايټس د پي پي پي څخه اخيستل کيږي. خالص سندونهmemory_get_peak_usage   ؛د کارولو بڼه بڼې ($ بټس، $ سمیټ = 2) {$ units = array ("b"، "kb"، "mb"، "gb"، "tb")؛$ بټټ = لوړ ($ بټس، 0)؛$ pow = floor (($ بټس؟ log ($ بکسونه): 0) / log (1024))؛$ pow = min ($ پونډ، شمیره ($ واحدونه - 1)؛$ بټس = = (1 << (10 * $ پو))؛د بیرته راګرځیدو پړاو ($ بټس، دقیقه $). "". $ واحدونه [$ پونډ]؛}    

سیمالټ زموږ د افکارونو په پایله کې دا فعالیتونه کاروي، نو موږ کولی شو چې وګورو چې په کوم وخت کې کوم سکریپټ تر ټولو حافظی کاروي.

زموږ انتخابونه څه دي؟

سیمالټ ډیری لارښوونې دي چې موږ کولی شو د فایلونو لپاره په اغیزمنه توګه لوستل وکړو. مګر دوه امکانات هم شته چې موږ یې کولی شو دوی وکاروو. موږ کولی شو ټول په یو وخت کې ډاټا لوستل او پروسس وکړو، د پروسس شوي ډاټا محصولاتو کولو یا نورو کړنو ترسره کول په هغه څه چې موږ یې لوستل. موږ همداشان کولی شو د معلوماتو معلوماتو ته د هرکله هیڅکله اړتیا ته پرته د سټراټيټ ډاټا بدل کړو.

راځئ تصور وکړو، د لومړي سناریو لپاره، موږ غواړو چې د فایل لوستلو او په هر 10،000 لینونو کې د قطارونو د جلا کولو کارونه رامنځته کړو. سیمالټ باید په حافظه کې لږترلږه 10،000 لینونه وساتئ، او د قطع شوي دندو مدیر ته یې ولېږئ (هر هغه څه چې ممکن وي).

د دویم سناریو لپاره، راځئ فکر وکړو موږ غواړو چې د ځانګړي API API ځواب محتويات راټول کړو. موږ د هغه څه پروا نه کوو چې دا وايي، مګر موږ باید ډاډ ترلاسه کړو چې دا د کمپونډې بڼه کې ملاتړ لري. په لومړي کې، موږ باید پوه شو چې معلومات څه دي. په دویمه برخه کې، موږ پروا نه کوو چې معلومات کوم دي. سیمالټ دغه اختیارونه وپلټئ .

د لوستلو فایلونه، د کرښې لیکه

د فایلونو سره د کار کولو لپاره ډیری دندې شتون لري. سیمال لږ تر لږه یو نوي فایل لوستونکي ته راځي:

     // د حافظې څخه. phpد کارولو بڼه بڼې ($ بټس، $ سمیټ = 2) {$ units = array ("b"، "kb"، "mb"، "gb"، "tb")؛$ بټټ = لوړ ($ بټس، 0)؛$ pow = floor (($ بټس؟ log ($ بکسونه): 0) / log (1024))؛$ pow = min ($ پونډ، شمیره ($ واحدونه - 1)؛$ بټس = = (1 << (10 * $ پو))؛د بیرته راګرځیدو پړاو ($ بټس، دقیقه $). "". $ واحدونه [$ پونډ]؛}د چاپ بڼه بڼې (یادښت / حافظه_پوڅی      ؛    
     // د لوستلو لپاره - فایلونه-لیک-لائن-1. phpکاروونکي لوستل د فايل ($ path) {$ لائن = []؛$ handle = fopen ($ path، "r")؛په داسې حال کې چې (فیف ($ handle)) {$ لین [] = ټیم (فیوزونه ($ handle))؛}بڼې ($ handle)؛$ لائن بیرته راستانه کړئ؛}ولولئ (د شکسپیر ټیکټ)."memory. php" ته اړتیا لري؛    

موږ د متن فایل لوستل یاست چې د شیکسپیر بشپړ کارونه پکې شامل دي. د متن دوسیه د 5MB په اړه ده، او د یاد حافظ حافظې کارول 11 8MB دي. اوس، راځئ د هر لین د لوستلو لپاره جنراتور استعمال کړو:

     // د مطالعاتو - فایلونو څخه لین-لیک-2. phpکاروونکي لوستل د فايل ($ path) {$ handle = fopen ($ path، "r")؛په داسې حال کې چې (فیف ($ handle)) {حاصلات ټیم (فټسونه ($ handle))؛}بڼې ($ handle)؛}ولولئ (د شکسپیر ټیکټ)."memory. php" ته اړتیا لري؛    

د متن فایل ورته عدد دی، مګر د یاد حافظ حافظ کارول 393 کیلوګرامه دی. دا د دې معنا نلري تر څو چې موږ د هغه معلوماتو سره چې موږ یې لوستل کوو ترسره کوو. شاید موږ دا سند په ټوټو کې ویشلو هرکله چې موږ دوه خالي کرښه وګورو. داسې ښکاري:

     // د لوستلو - فایلونو څخه لین-درې-3. php$ تايیرګر = د لوست فورمه ("شیکسپیر ټیک")؛$ بفر = ""؛منچ ($ تکرار $ $ تکرار) {preg_match ("/ \ n {3} /"، $ بفر، $ میلونه)؛که (شمیرې) $ $   چاپ ".$ بفر = ""؛} else {$ بسته. = $ تکرار. PHP_EOL؛}}"memory. php" ته اړتیا لري؛    

هر ډول اټکلونه اوس موږ څومره کاروئ؟ ایا تاسو به حیرانتیا درکړو چې، که څه هم موږ د متن سند 1،216 ټانکونو ته ویش، مګر موږ لاهم د حافظې 459 کیلوګرامه څخه کار اخلو؟ د جنراتورانو طبیعت ته په پام سره، هغه ډیر یادونه چې موږ یې کاروو هغه دا دی چې موږ باید په یوه تکرار کې د لوډ ټکي ډډ ذخیره کړو. په دې حالت کې، لوی غټ دی 101،985 توريونه.

ما د جنراتورونو او نیکتا پاپوف سیمالټ کتابتون څخه کار اخیستلو د فعالیتونو په اړه لیکلي دي، نو لدې کبله وګورئ که تاسو غواړئ نور وګورئ!

سیمالټ نور کارونې لري، مګر دا د لویو فایلونو پرمخ وړلو لوستلو لپاره خورا ښه ده. که موږ د معلوماتو په اړه کار وکړو، جنراتوران شاید ترټولو غوره لاره وي.

د فایلونو تر مینځ نلونه

په هغه شرایطو کې چې موږ په ډاټا باندې کار کولو ته اړتیا نلرو، موږ کولی شو د فایل ډاټا د یو فایل څخه بل ته ولیږو. دا په عمومي ډول د پایپینګ په نامه یادېږي) (احتمالا ځکه چې موږ نه پوهیږو چې په پائپ کې څه شی دی مګر په هر پای کې .پرته لدې چې ناڅاپي وي، البته!). موږ کولی شو د سیسټمونو له لارې ترلاسه کړو. راځئ لومړی لومړی یو لیکنه ولیکئ ترڅو د یو فایل څخه بل ته بل ولیږدوو، نو موږ کولی شو د یادونې کار اندازه وکړو:

     // له نل لیکنې - فایلونو څخه. phpfile_put_contents ("piping-files-1 txt"، file_get_contents ("shakespeare txt"))؛"memory. php" ته اړتیا لري؛    

له بده مرغه، دا سکریپټ د متن فایل څخه د چلولو لپاره لږ حافظه کاروي. سیمالټ ځکه چې دا د فایل منځپانګې په حافظې کې لوستل (او وساتئ تر هغه چې دا نوې فایل ته لیکلي وي). د وړو فایلونو لپاره، دا به سم وي. کله چې موږ د لویو فایلونو کارولو پیل کوو، نه .

سیمالټ د یو دوتنې څخه بل ته بل پړاو (یا نل لیکنه) هڅه وکړي:

     // له نل لیکې - فایلونو څخه 2. txt "،" r ")؛$ handle2 = fopen ("piping-files-2 txt"، "w")؛stream_copy_to_stream ($ handle1، $ handle2)؛بڼې ($ handle1)؛بڼې ($ handle2)؛"memory. php" ته اړتیا لري؛    

دا کوډ یو څه عجيب دی. موږ دواړه فایلونو ته لاسونه پرانیزي، لومړی د لوستلو موډل کې او دوهم یې د لیک بڼه کې. بیا موږ د لومړی څخه دویمې برخې ته کاپی کوو. موږ بیا د دواړو فایلونو بندولو سره پای ته ورسوو. شاید تاسو ته حیرانتیا درکړي چې یاد شوي حافظه کارول کیږي 393KB .

داسې ښکاري. ایا دا د هر کرښې په لوستلو کې د جنریټر کوډ کوم ذخیره کارول کیده؟ دا ځکه چې دویم دلیل فټسونه مشخص کوي چې د هر کرښې څومره بیټرې لوستل کیږي (او د -1 ته یې سپموي یا تر هغه چې نوی لین ته ورسیږي).

دریم دلیل stream_copy_to_stream ته ورته پیراټټر (په ورته ډول په ورته ډول سره). stream_copy_to_stream د یوه سټیټ څخه لولي، یو لیک په یو وخت کې، او بل بل ته لیکل کیږي. دا هغه برخه چیرې چې جنریټر ارزښت لري، ځکه چې موږ د دې ارزښت سره کار کولو ته اړتیا نلرو.

دا متن پپاس زموږ لپاره ګټور نه دی، نو اجازه راکړئ د نورو مثالونو فکر وکړو چې ممکن وي. سیمال موږ غوښتل چې زموږ د CDN څخه یو عکس تولید کړو، د یو بل لارښوونې غوښتنلیک په توګه. موږ کولی شو دا د لاندې سره ورته ورته کوډ سره وښایه:

     // له نل لیکنې - فایلونو څخه 3. phpfile_put_contents ("piping-files-3. jpeg"، file_get_contents ("د ګیټس: // ګیتب. com / assertchris / اپلوډونه / خام / ماسټر / ریک jpg"))؛// یا دا سمدستي د Stdout لپاره ولیکئ، که موږ د یادونې معلومات ته اړتیا نلرو"memory. php" ته اړتیا لري؛    

د غوښتنلیک لارښود موږ ته دا کود راوړو. مګر د ځایي فایل سیسټم څخه یو فایل په توګه خدمت کول، موږ غواړو چې دا د CDN څخه واخلو. موږ ممکن د file_get_contents د نورو ښکلا (لکه Guzzle) لپاره انتخاب کړو، مګر د پټولو لاندې دا یو ډیر ورته دی.

د حافظې کارول (د دې تصویر لپاره) شاوخوا 581KB دي. اوس، موږ څنګه هڅه کوو چې دا کار بدل کړو؟

     // له نل لیکنې - فایلونو څخه 4. php$ handle1 = فلاپ ("https: // ګیتوب. com / assertchris / اپلوډونه / خام / ماسټر / ریک. jpg"، "r")؛$ handle2 = فلاپ ("piping-files-4. jpeg"، "w")؛// یا دا سمدستي د Stdout لپاره ولیکئ، که موږ د یادونې معلومات ته اړتیا نلروstream_copy_to_stream ($ handle1، $ handle2)؛بڼې ($ handle1)؛بڼې ($ handle2)؛"memory. php" ته اړتیا لري؛    

د حافظې کارول لږ لږ دی (په 400KB )، مګر نتیجه ورته ده. که موږ د یادونې معلومات ته اړتیا نه درلوده، موږ کولی شو معیاري محصول ته هم چاپ کړو. په واقعیت کې، پی ایچ پی د دې کولو لپاره یو ساده لار برابروي:

     $ handle1 = ورپسې ("https: // ګیتوب. com / assertchris / اپلوډونه / خام / ماسټر / ریک. jpg"، "r")؛$ handle2 = فلاپ ("php: // stdout"، "w")؛stream_copy_to_stream ($ handle1، $ handle2)؛بڼې ($ handle1)؛بڼې ($ handle2)؛// "memory. php" ته اړتیا لري    

نور نښې

سیمالټ یو څو نورې نښې دي چې موږ کولی شو پاپ او / یا یې ولیکئ او / یا یې ولیکئ:

  • php: // stdin (یواځې لوستل)
  • php: // stderr (یوازې لیکل، لکه php: // stdout)
  • php: // انټرنیټ (یواځې لوستل) کوم چې موږ د خام غوښتونکي بدن ته لاس رسی راکوي
  • php: // output (یوازې یوازې) کوم چې موږ ته د یو محصول بسته کې لیکل کیږي
  • php: // حافظ او php: // temp (لوستل لیک) هغه ځايونه دي چې موږ کولای شو په لنډ وخت کې معلومات ذخیره کړو. توپیر دا دی چې php: // temp به د فایل سیسټم کې ډاټا ذخیره کړي کله چې دا لویه اندازه وي، پداسې حال کې چې php: // حافظ .

فلټرونه

بله بله لاره ده چې موږ یې د ونو سره کارولای شو فلټر نومیږي. دوی یو بل ګام دی، پرته له دې چې موږ ته یې درکوي پرته د سټراټیټ په اړه لږ کنترول چمتو کوي. تصور وکړئ موږ غواړو چې زموږ شکسپیر کمپرسۍ وکړو. ټیکټ . php$ زپ = نوی جیو آرچیو ؛$ filename = "فلټر - 1. زپ"؛$ زپ پرانیستی (د $ filename، ZipArchive :: CREATE)؛$ زپ اضافه کولو سپارښتنه ("شیکسپیکر ټسټ"، file_get_contents ("شیکسپیر ټیکټ"))؛$ زپ - قریبی ؛"memory. php" ته اړتیا لري؛

دا د کوډ یو ناباوره دی، مګر دا شاوخوا شاوخوا 10. 75MB ګرځي. موږ کولی شو د غوره فلټرونو سره:

     // د فلټر 2 څخه. php$ handle1 = فلاپ ("php: // فلټر / zlib. ټوټه ټوټه / سرچینه = شیکسپیر. txt"، "r")؛$ handle2 = فلاپ ("فلټر - 2 ککړ شوی"، "w")؛stream_copy_to_stream ($ handle1، $ handle2)؛بڼې ($ handle1)؛بڼې ($ handle2)؛"memory. php" ته اړتیا لري؛    

دلته، موږ php: // فلټر / zlib لیدلی شو. فلټر کړئ، کوم چې د سرچینې محتويات لوستل او کمپلي کوي. بیا موږ کولی شو دا کمپای شوي ډاټا بل بل فایل ته واچوئ. دا یوازې 896 کیلوګرامه کاروي.

زه پوهیږم چې دا یو ورته بڼه نده، یا د زپ آرشیف جوړولو لپاره زیاتوالي شتون لري. تاسو باید حیران شئ که چیرې تاسو کولی شئ مختلف ډوله بڼه وټاکئ او حافظه یې 12 ځله وساتئ، نو نه؟

د ارقامو د نشتوالي لپاره، موږ کولی شو فایل شوي فایل بېرته د بل زیلب فلټر له لارې وخوځوو:) 13

     // د فلټر 2 څخه. phpfile_get_contents ("php: // فلټر / زیلب. فاسټ / سرچینې = فلټر -2 - ټوټه ټوټه شوې")؛    

سټیټونه په پراخه کچه "په PHP کې درک لرونکي سټینډ" او "د PHP سټینډز سیمالټ کارول" کې پوښلي. که تاسو یو بل نظریه غواړئ، هغه وګورئ!

د ګمرکونو سیسټمونه

fopen او file_get_contents د دوی د اصلي سرغړونې انتخاب لري، مګر دا په بشپړه توګه دوديز دي. د دوی تعریف کولو لپاره، موږ اړتیا لرو ترڅو د نوي سټراټيژی شرایط رامنځته کړو:

) 48 4 (// د شرایطو له مخې - 1. php$ ډاټا = ګډون ("&"، ["twitter = assertchris"])؛$ سرونه = سره یوځای شئ ("\ r \ n"، ["د منځپانګې ډول: درخواست / x-www-form-urlencoded"،"د منځپانګې - اوږدوالی:". (د $ ډاټا ډاټا)])؛$ options = ["http" => ["میتود" => "پوسټ"،"header" => $ headers،"منځپانګې" => $ ډاټا،]،]؛$ context = stream_content_create ($ بڼې)؛$ handle = fopen ("https: // example com com / register"، "r"، false، $ context)؛$ ځواب = stream_get_contents ($ handle)؛بڼې ($ handle)؛ ) 10 (په دې مثال کې، موږ هڅه کوو چې د API پوسټ) 39 (غوښتنه وکړو. د API پایپ ټیکټ خوندي دی، مګر موږ لا هم د http د ملکیت (لکه څنګه چې د http (http) او https لپاره کارول کیږي استعمالوو. موږ یو څو سرلیکونه ټاکلي او د فایل لاسوند API ته یې پرانیزي. موږ کولی شو د هارډ په څیر د لوستلو لپاره یوازې پرانیزئ ځکه چې شرایط د لیکنې پاملرنه کوي.

سیمالټ هغه شیان دي چې موږ یې حساس کولی شو، نو دا به تر ټولو غوره وي چې اسناد وګورئ که تاسو غواړئ نور معلومات وپیژني.

د ګمرکونو پروتوکولونه او فلټرونه

سیمالټ موږ کارونه سرته رسوو، راځئ چې د دودیز پروتوکولونو جوړولو په اړه خبرې وکړو. نیمګړتیاوې چې باید ترسره شي. مګر کله چې دا کار سرته ورسیږي، موږ کولی شو خپل سریزه په اسانۍ سره ثبت کړو:

     که چیرې ("نخښه" نومونه، stream_get_wrappers   )) {تلویزیون نومونې ("اشاره-نوم")؛}تلویزیون - راجستر ("اشاره-نومونه"، "د سپک نوم نوم پروتوکول")؛$ highlighted = file_get_contents ("highlight-names: // story. txt")؛    

سیمالټ، دا د ممکنې سټراټ فلټرونو جوړول هم ممکن دی. اسناد د فلټر ټولګې مثال:

     فلٹر {عامه $ filtername؛عامه $ پارامونهعامه فلټر (سرچینه $ $، سرچینه $ $، int & $ مصرف شوي،بون $ بندول)عامه باطل پر کلک (صفر)عامه بڼ پرانیستل (باطل)}    

دا کولی شي په اسانۍ سره راجستر شي:

     $ handle = fopen ("کیسه. txt"، "w +")؛stream_filter_append ($ handle، "highlight-names"، STREAM_FILTER_READ)؛    

څرګندونې - نومونه باید د فلټر کلاس فلترام ملکیت سره سمون ولري. دا ممکنه ده چې د php: // فلټر / لوړ لیګ-نوم / سرچینې = کیسه کې د فلټر فلټرونو کارولو لپاره کار واخیستل شي. ټیکټ تار. د پروتوکولونو تعریف کولو لپاره د فلټر تعریف کولو لپاره خورا اسانه دی. د دې لپاره یو دلیل دا دی چې پروتوکولونه د ډیری ډیریدونکو عملیاتو د ترسره کولو اړتیا لري، پداسې حال کې چې یوازې د هرې برخې ډیټا ته اړتیا لري فلټر.

که تاسو ګومان لرئ، زه په کلکه هڅوم چې د دودیز پروتوکولونو او فلټرونو سره تجربه کولو تجربه وکړم. که تاسو کولی شئ stream_copy_to_stream عملیاتونو لپاره فلټرونه وکاروي، ستاسو غوښتنلیکونه به په غیر منظم ډول د حافظې په لویو فایلونو سره کار کولو حتی د حافظې لپاره کارول کیږي. فکر وکړئ بیاکتنه-انځور فلټر یا او انټریپټ-لپاره-غوښتنلیک فلټر.

لنډیز

سیمالټ دا یوه ستونزه نه ده چې موږ یې په ځینو وختونو کې ځورول کیږو، د لویو فایلونو سره کار کولو په وخت کې د خوندیتوب آسانه ده. د غیر عین وخت غوښتنلیکونو کې، دا د اسانه کولو لپاره اسانه ده چې ټول سرور لاړ شي کله چې موږ د حافظې کارولو په اړه محتاط نه یاست.

دا ټیکنالوژی په امید سره تاسو یو څو نوي نظرونو ته وړاندې کړی (یا د دوی په اړه ستاسو یاد یادونه کړئ)، نو تاسو کولی شئ د لوی فایلونو په اغیزمنه توګه لوستلو او لوستلو په اړه فکر وکړو. کله چې موږ د سټرو او جنراتورونو سره پیژندل پیلوو، او د افعالونو څخه لکه د file_get_contents څخه مخنیوی ودروو: زمونږ د غوښتنلیکونو څخه د غلطۍ ټول ټولګۍ له لاسه ورکړې. دا د هدف لپاره د ښه شیانو په څیر ښکاري!

March 1, 2018