2009-05-31 2 views
3

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

Как это действительно так?

ответ

3

Если вы выставляете действительно большие строки с эхом, лучше использовать несколько выражений эха.

Это связано с тем, что Nagle's algorithm заставляет данные буферизоваться по протоколу TCP/IP.


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

+0

Итак, вы рекомендуете разделить выходную переменную, указанную на максимальном размере, и повторить каждую часть? – Ivar

+0

Если у вас есть веские основания полагать, что это увеличит вашу производительность, да, я знаю. – Silfverstrom

+0

Ну, я упомянул о своей причине в своем первом сообщении - помещать все содержимое в одну переменную может быть достаточно сильной причиной. – Ivar

3

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

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

+0

О, это сайт, на котором я его прочитал. Спасибо. – Ivar

0

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

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

........

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

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

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

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

0

Это моя версия решения, это 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');