Задать вопрос
mifa
@mifa

PHP: очень медленно работает echo

Странная проблема, простейший код:

echo $content;

Где $content = 100-110 кб чистого хтмла — выполняется почти секунду!
Пробовал создавать отдельную страницу, где даже нет переменных, просто echo и 100 кб текста, все равно очень медленно.

В гугле такие жалобы встречаются, однако все датированы 2005-2006 годами и решения сводятся к игре с output_buffering или разделением $content на части, что не помогает.

Уважаемый Хабраразум, помоги, неужели echo такая тормозная, или же в консерватории что поправить?
  • Вопрос задан
  • 3654 просмотра
Подписаться 2 Оценить 6 комментариев
Пригласить эксперта
Ответы на вопрос 12
maxout
@maxout
Была такая проблема на production. ОС на сервере какая?
Ответ написан
@rPman
Почти наверняка проблемы с вебсервером или может быть DNS?

gentoo, apache, тормозной старенький AMD Sempron(tm) Processor 3400+

a.php: <?php echo str_repeat('0123456789012345',8192); ?>

# date; curl http://localhost/a.php >/dev/null;date
Втр Авг 9 20:15:03 NOVST 2011
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 128k 0 128k 0 0 31.4M 0 --:--:-- --:--:-- --:--:-- 41.6M
Втр Авг 9 20:15:03 NOVST 2011


p.s. но если у вас тоже самое с cli php то нужно бить тревогу!!!

p.p.s. у меня на first vds был момент, когда простейший lib_curl (точнее вызовы curl_… из php) нещадно подвешивали виртуалку под 100% на секунды, но в то же время консольная утилита curl/wget — работали без проблем… пока вообще выяснял, откуда тормоза, проблема самоустранилась (длилась часами), поэтому записал на счет потенциальных глюков openvz (точнее virtuozzo) и сделал зарубку в памяти, что и такое возможно.
Ответ написан
MpaK999
@MpaK999
Буду!
АПД: Проблема локализована, и она не в PHP: любой вебсервер отдает статичный файл в 100 кб около секунды. И нгникс и апаче. На оба почти нулевая нагрузка.
Ответ написан
Комментировать
colonel
@colonel
Разработчик PHP, Laravel
Выполняется начиная с момента запроса из браузера?
Там до echo ещё много чему нужно отработать, начиная с веб-сервера.
Это нужно всё проверять, вычислять, где именно задержка.
Ответ написан
AlexeyK
@AlexeyK
а что по-вашему значит «выполняется»?
Ответ написан
theRavel
@theRavel
Как вы измеряете время выполнения? Запускаете через консоль или через браузер?
Ответ написан
Не знаю как ты меряешь, попробуй так.
<?PHP
$start = microtime();
// Твое ехо
$end = microtime();
echo 'Время - ' . ($endtime - $starttime) . ' микросекунд';
?>
Ответ написан
@s0rr0w
Расскажите подробнее про сервер, на котором вы все это тестируете. Интересует его железо, операционка, текущая загрузка.
Ответ написан
Комментировать
@Nc_Soft
ob_start() не помогает?
Какой output buffering в php.ini?
Ответ написан
Комментировать
@galaxy
АПД2: Если запустить скрипт из консоли — выполняется 2.2 сек (в скрипте одно большое echo). А если перенаправить вывод в /dev/null, а microtime в error_log — то выполняется 0.003 сек

Это сеть (скорее всего, ssh канал между вами и сервером). Пример:

> time cat [текстовый лог на 1.3М]
real 0m52.905s
user 0m0.000s
sys 0m0.012s

> time cat [тот же файл] > log.txt
real 0m0.015s
user 0m0.000s
sys 0m0.004s

Что касается веб-сервера, время может уходить на резолвинг (как указали выше), маршрутизацию/нат/свичинг собственно в локалке, соединение + плюс TCP некоторое время (точнее, несколько пакетов туда-обратно) нужно, чтобы выйти на полную скорость.
Последовательно отсеивайте причины: nslookup или скачивание напрямую по IP (DNS), ping (скорость пакетов по локалке, потери пакетов), tcpdump — универсальный инструмент, смотрим, что когда и как отдается.
Ответ написан
Комментировать
AxisPod
@AxisPod
Учитывая факт, что тормозит, следует проверить дисковую систему и инет канал, имеет смысл выполнить локально ab. Вообще я бы советовал начать с strace, хорошо покажет время выполнения системных вызовов, проблем может быть множество.
Ответ написан
Комментировать
p4s8x
@p4s8x
Я не совсем понял читали ли вы это:Функция echo в PHP может выполняться более 1 секунды
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы