سؤال

أنا أستخدم دائما متغير إخراج في PHP حيث أجمع كل المحتوى قبل أن أضرب منه. ثم قرأت في مكان ما (لا أتذكر أين، على الرغم من ذلك، هل تحصل على أفضل أداء إذا قمت بتقسيم متغير الإخراج إلى حزم ثم صدى كل حزمة بدلا من متغير الإخراج بأكمله.

كيف هو حقا؟

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

المحلول

إذا كنت تنتج سلاسل كبيرة حقا مع صدى، فمن الأفضل استخدام بيانات الصدى المتعددة.

هذا بسبب الطريق خوارزمية nagle. يؤدي إلى تخزين البيانات مؤقتا عبر TCP / IP.


وجدت ملاحظة على php-bugs حول هذا الموضوع:
http://bugs.php.net/bug.php؟id=18029.

نصائح أخرى

سيقوم هذا بتفكيك السلاسل الكبيرة تلقائيا إلى قطع أصغر وأصدقها:

function echobig($string, $bufferSize = 8192) {
  $splitString = str_split($string, $bufferSize);

  foreach($splitString as $chunk) {
    echo $chunk;
  }
}

مصدر: http://wonko.com/post/seeing_poor_performance_using_phps_echo_statement_heres_why.

أعتقد أنه يتم تقديم حل أفضل هنا ....

http://wonko.com/post/seeing_poor_performance_using_phps_echo_stat_heres_why#comment-5606.

........

الرجال، وأعتقد أنني ضاقت لأسفل حتى أكثر!

كما قال سابقا، سوف يترك PHP التخزين المؤقت لسباق PHP إلى نهاية البرنامج النصي الخاص بك، ولكن بعد ذلك، لا يزال "تعليق" أثناء محاولة تمرير كل هذه البيانات إلى Apache.

الآن كنت قادرا، ليس فقط لقياس هذا (انظر التعليق السابق) ولكن في الواقع القضاء على فترة الانتظار داخل PHP. فعلت ذلك عن طريق زيادة sendbuffer apache مع التوجيه sendbuffersize.

هذا يدفع البيانات من PHP بشكل أسرع. أعتقد أن الخطوة التالية ستكون لإخراجها من Apache بشكل أسرع، لكنني لست متأكدا مما إذا كان هناك بالفعل طبقة قابلة للتكوين آخر بين Apache و RAW Network Bredwidth.

هذه هي نسختي من الحل، إنه Echos فقط إذا لم يتم إحباط الاتصال. إذا قطع المستخدم ثم مخارج الوظيفة.

<?php
function _echo(){
    $args    = func_get_args();
    foreach($args as $arg){
        $strs = str_split($arg, 8192);
        foreach($strs as $str){
            if(connection_aborted()){
                break 2;
            }
            echo $str;
        }
    }
}
_echo('this','and that','and more','and even more');
_echo('or just a big long text here, make it as long as you want');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top