سؤال

هل هناك أي طريقة للحد من كمية البيانات حليقة سوف جلب ؟ أنا الشاشة تجريف البيانات من صفحة 50 كيلوبايت, لكن البيانات لا تتطلب هو في أعلى 1/4 الصفحة لذلك أنا حقا فقط الحاجة إلى استرجاع الأولى 10kb من الصفحة.

أنا أسأل لأن هناك الكثير من المعلومات التي كنت بحاجة إلى رصد مما يؤدي إلي نقل مقربة من 60 جيجابايت من البيانات شهريا ، عند حوالي 5GB من عرض النطاق الترددي هذا هو ذات الصلة.

أنا باستخدام PHP لمعالجة البيانات ، ومع ذلك أنا مرنة في استرجاع البيانات نهج يمكنني استخدام حليقة, WGET fopen.... الخ

نهج واحد أنا أفكر هو

$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);

هل ما سبق يعني أنني سوف ينقل فقط من 6kb www.website.com أو سوف fopen تحميل www.website.com في الذاكرة معنى أنا سوف لا تزال نقل كامل 50 كيلوبايت?

هل كانت مفيدة؟

المحلول

وأنت قد تكون قادرة على انجاز أيضا ما كنت تبحث عن باستخدام الضفيرة كذلك.

إذا نظرتم الى وثائق CURLOPT_WRITEFUNCTION الذي يمكن تسجيل الاستدعاء الذي يسمى كلما البيانات متاح للقراءة من الضفيرة. هل يمكن بعد ذلك عد بايت وردت، وعندما كنت قد وردت أكثر من 6،000 بايت يمكنك العودة 0 لإجهاض ما تبقى من عملية التحويل.

يبكورل ثائق تصف رد أكثر قليلا:

<اقتباس فقرة>   

ويحصل على استدعاء هذه الوظيفة يبكورل في أقرب وقت كما أن هناك البيانات الواردة التي تحتاج إلى   تم الحفظ. إرجاع عدد البايتات   اتخذت فعلا رعاية. إذا هذا المبلغ   يختلف من المبلغ الذي تم تمريره إلى الخاص   وظيفة، وأنها سوف إشارة خطأ إلى   مكتبة وسيتم إحباط نقل   وعودة CURLE_WRITE_ERROR.

     

وسيتم تمرير دالة رد   كما الكثير من البيانات ممكن في كل   يتضرع، ولكن لا يمكنك ربما جعل   أي افتراضات. قد يكون من بايت واحد،   قد يكون من الآلاف.

نصائح أخرى

وهذا هو أكثر من HTTP أن مسألة الضفيرة في الواقع.

وكما خمنت، صفحة كاملة سوف يتم تحميلها إذا كنت تستخدم FOPEN. بغض النظر عن ذلك إذا كنت تسعى عند الإزاحة 5000 أم لا.

وأفضل وسيلة لتحقيق ما تريد أن يكون لاستخدام طلب جزئي HTTP GET، كما جاء في HTML RFC (<لأ href = "http://www.w3.org/Protocols/rfc2616/rfc2616-sec9. أتش تي أم أل "يختلط =" noreferrer نوفولو "> http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html ):

<اقتباس فقرة>   

وودلالات تغيير طريقة GET   ل"GET جزئي" إذا كان الطلب   تتضمن رسالة حقل رأس المدى.   A طلبات GET جزئية ذلك الجزء الوحيد   الكيان أن يتم تحويلها، كما   هو موضح في القسم 14.35. ال   ويهدف طريقة GET جزئي ل   تقليل استخدام شبكة الاتصال غير الضرورية من قبل   السماح للكيانات التي تم استردادها جزئيا   أن يكتمل دون نقل   البيانات الموجودة بالفعل من قبل العميل.

وتفاصيل طلبات GET جزئية باستخدام نطاقات هو موضح هنا: http://www.w3.org/Protocols/rfc2616/ RFC2616-sec14.html # sec14.35.2

HTTP RANGE طلب :

GET /largefile.html HTTP/1.1
Range: bytes=0-6000

إذا تتراوح يدعم الخادم طلبات ، فإنه سيعود 206 الجزئي رمز الاستجابة المحتوى مع رأس Content المدى والنطاق المطلوب الخاص بك بايت (إذا لم يحدث ذلك، فإنه سيعود 200 والملف بأكمله). يمكنك الاطلاع على http://benramsey.com/archives/206-partial- ، طلبات محتوى والمدى / للحصول على لطيفة شرح طلبات النطاق.

وانظر أيضا عند استخدام PHP لإرسال الملف ؟ .

فإنه سيتم تحميل صفحة كاملة مع fopen الاتصال ولكن بعد ذلك سوف فقط قراءة 6kb من تلك الصفحة.

من PHP دليل:

القراءة يتوقف في أقرب وقت واحد من الشروط التالية:

  • طول بايت تم قراءة
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top