PHP эхо производительность - PullRequest
3 голосов
/ 31 мая 2009

Я всегда использую выходную переменную в PHP, где я собираю весь контент, прежде чем его выводить. Затем я где-то прочитал (хотя и не помню, где), что вы получите лучшую производительность, если разделите выходную переменную на пакеты, а затем отобразите каждый пакет вместо всей выходной переменной.

Как это на самом деле?

Ответы [ 4 ]

3 голосов
/ 31 мая 2009

Это автоматически разбивает большие строки на более мелкие куски и выводит их на экран:

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

3 голосов
/ 31 мая 2009

Если вы выводите действительно большие строки с помощью echo, лучше использовать несколько операторов echo.

Это связано с тем, что алгоритм Нейгла приводит к буферизации данных по TCP / IP.


Нашел заметку об этом на Php-ошибках:
http://bugs.php.net/bug.php?id=18029

0 голосов
/ 16 февраля 2016

Это моя версия решения, оно отображается только в том случае, если соединение не прерывается. если пользователь отключается, то функция завершается.

<?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');
0 голосов
/ 15 июня 2011

Я думаю, что лучшее решение представлено здесь ....

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

........

Ребята, я думаю, что сузил это еще больше!

Как говорилось ранее, буферизация PHP позволит PHP дойти до конца вашего скрипта, но после этого все равно будет зависать при попытке передать все эти данные в Apache.

Теперь я смог не только измерить это (см. Предыдущий комментарий), но и фактически исключить период ожидания внутри PHP. Я сделал это, увеличив Apache SendBuffer с помощью директивы SendBufferSize.

Это быстрее выталкивает данные из PHP. Я предполагаю, что следующим шагом будет вывести его из Apache быстрее, но я не уверен, существует ли фактически другой настраиваемый уровень между Apache и пропускной способностью необработанной сети.

...