سؤال

لدي برنامج نصي تعدين بيانات طويل للغاية، وفي أجزاء منه، أردد بعض المعلومات إلى الصفحة (أثناء حلقة Foreach، في الواقع.)

ومع ذلك، فأنا لاحظ أن المعلومات يتم إرسالها إلى الاستعراض ليس على الفور كما كنت أتمنى، ولكن في "شرائح".

هل هناك بعض الوظائف يمكنني استخدامها بعد صدى بلدي لإرسال جميع البيانات إلى المتصفح على الفور؟

شكرا.

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

المحلول

ربما تريد flush(). وبعد ومع ذلك، قد يكون PHP استخدام التخزين المؤقت الإخراج. هناك بعض الطرق التي يمكن أن تغير هذه الأشياء، ولكن باختصار، يمكنك flush(), ، ومن بعد ob_flush().

نصائح أخرى

يمكنك محاولة استخدام Flush () بعد كل صدى، ولكن حتى أنه لن يضمن الكتابة إلى العميل اعتمادا على خادم الويب الذي تقوم بتشغيله.

نعم، سيؤدي الحشو إلى الإخراج إلى 1024 بايت معظم المتصفحات لبدء عرض المحتوى.

لكننا نتعلم أيضا من @ إجابة لا أحد على السؤال "كيفية تدفق الإخراج بعد استدعاء كل `صدى؟"يحدث تأثير التخزين المؤقت للمستعرض البايت 1024 فقط عندما يتعين على المتصفح تخمين ترميز الشخصية للصفحة، والتي يمكن الوقاية منها عن طريق إرسال رأس نوع المحتوى المناسب (على سبيل المثال." النوع المحتوي: نص / HTML؛ Charset = UTF -8 ")، أو عن طريق تحديد تجارب المحتوى من خلال علامات تيا المناسبة HTML. وقد عملت كذلك بالنسبة لي في جميع المتصفحات.

في الأساس، كل ما يحتاج إلى القيام به هو:

header('Content-Type: text/html; charset=utf-8');
ob_implicit_flush(true);

مع عدم وجود شرط للحشوة الإضافية أو التنظيف، والتي هي فائدة مستحضرات التجميل العظيمة للقانون! بطبيعة الحال، يجب إرسال الرؤوس قبل أي محتوى، ويتعين على المرء أيضا التأكد من عدم وجود تخطيط التخزين المؤقت للناتج.

المشكلة بالتأكيد حلها بالنسبة لي! من فضلك (+1) @ إجابة أحد على السؤال الآخر أيضا إذا كان يعمل لك. إذا كان هناك، على الرغم من أن المرء لا يزال يواجه مشاكل، أقترح التحقق من الإجابات على هذا السؤال الآخر للحالات المحددة الأخرى التي قد تمنع التصفية الضمنية من العمل بشكل صحيح.

لاحظ أيضا أن بعض المتصفحات لن تبدأ في عرض أي شيء حتى يحتوى جسم الاستجابة على كمية معينة من البيانات - مثل 256 أو 1024 بايت. لقد رأيت التطبيقات قبل تلك البيانات الوسادة مع تعليق طويل بحرف 1024 بالقرب من أعلى الصفحة، قبل أن يقوموا بالتدفق. إنه قليل من الاختراق، ولكنه ضروري.

ينطبق هذا على Internet Explorer و Safari iirc.

وبالتالي،

  • إذا كانت الطائرة الأولى، فتأكد من إخراج ما لا يقل عن 1024 بايت Sofar (لا يشمل رؤوس HTTP).
  • استدعاء فلوش ()
  • إذا كان بإمكانك تحديد أن هناك مخزن مؤقت للإخراج في مكانه، فاتح OB_FLUSH ()

أحب فقط استخدام

while (ob_get_level()) ob_end_flush();

بالقرب من بداية البرنامج النصي في مكان ما، ثم فقط

flush();

كلما أردت أن أفسد. يفترض أن هذا لا تريد أي تخزين مؤقت إخراج على الإطلاق، حتى لو تم إعداده قبل البرنامج النصي (مثل تكوين PHP.INI أو HTACCESS).

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

flush();
ob_flush();

فخ أخيرا وجدت الإجابة على مشكلة المخزن المؤقت جوجل كروم! بفضل poysmakesh لدفع في الاتجاه الصحيح. إليك الوظيفة التي أستخدمها:

function buffer_flush(){

    echo str_pad('', 512);
    echo '<!-- -->';

    if(ob_get_length()){

        @ob_flush();
        @flush();
        @ob_end_flush();

    }

    @ob_start();

}

وهذه هي الطريقة التي أسميها:

show_view('global', 'header'); // Echos the <html><head>... tags and
                               // includes JS and CSS.

show_view('global', 'splash_screen'); // Shows a loading image telling
                                      // the user that everything's okay.

buffer_flush(); // Pretty obvious. At this point the loading view shows
                // up on every browser i've tested (chrome, firefox,
                // IE 7 & 8)

show_view('global', 'main'); // Has a loop that echos "Test $i<br>" 5
                             // times and calls buffer_flush() each time.

show_view('global', 'footer'); // End the html page and use JQuery to
                               // fade out the loading view.

للعمل تماما في جوجل كروم، جرب هذا:

$i = 0;
$padstr = str_pad("",512," ");
echo $padstr;

while ($i <= 4){
    $padstr = str_pad("",512," ");
    echo $padstr;
    echo "boysmakesh <BR> ";
     flush();
    sleep(2);
    $i = $i + 1;
}

ترسل EE 512 بايت قبل إرسال كل صدى. لا تنس أن تضع <BR> في نهاية المحتوى قبل أن تدفع. آخر لن يعمل في Chrome ولكن يعمل في IE.

البيانات التي نقوم بحشوها تعتمد على المتصفح. بالنسبة لبعض المتصفحات، يكفي أن يكون لديك 256 بايت ولكن البعض بحاجة إلى 1024 بايت. لكروم هو 512.

ignore_user_abort(TRUE); // run script in background
set_time_limit(0); // run script forever
$interval=150000;
$i = 0;

if(
  strpos($_SERVER["HTTP_USER_AGENT"], "Gecko") or
  strpos($_SERVER["HTTP_USER_AGENT"], "WebKit")
){
  # important to change browser into quirks mode
  echo '<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
}

function buffer_flush(){
    echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n";
    for ( $i = 0; $i < 5; $i++ )
        echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n";

    while ( ob_get_level() )
        ob_end_flush();

    if(ob_get_length()){
        @ob_flush();
        @flush();
        @ob_end_flush();
    }
    @ob_start();
}

ob_start(); 

do{

  if($i<10){
    buffer_flush(); 
    echo ". ";    
    buffer_flush(); 
    usleep($interval);

  } else {
    echo sprintf("<pre>%s</pre>", print_r($_SERVER,true));
    break;
  }

  $i++;

}while(true);

تشغيل PHP 5.5 على IIS 7، أي 11 (WIN Server) لقد وجدت أن هذا يعمل على الأسطر الافتتاحية للملف. ملاحظة وضع عبارة أثناء أثناء سراح الرأس قبل أن تسبب الرأس في وجود رأس خطأ بالفعل.

header('Content-Type: text/html; charset=utf-8');
while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);

مراجع أخرى إلى ob_flush () في البرنامج النصي تسبب في وجود مخزن مؤقت غير موجود خطأ.

هذا يعمل بشكل جيد عندما كنت أتعامل مع ملف وإرسال عبارات SQL للمتصفح، ولكن عندما قمت بإلغاء ربط DB (MS Server 2008) لم يكن لدي أي إدخال تم إرجاعه حتى يتم إكمال البرنامج النصي.

عملت هذه المجموعة أخيرا بالنسبة لي، بناء على إجابة Thomasrutter

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top