Как определить участок кода, который долго выполняется

PHProgress

Новичок
Суть проблемы - очень долго открывается сайт (30 секунд и более)
После того как открылся - создался кэш все начинает работать нормально - странички отрываются в лет...

Как понять какой участок кода приводит "тормозам" на сайте...
И можно ли как-то с помощью хостинга, логов отследить на какой участок сколько затрачено времени...

PHP:
PHP print - время генерации кода не подходит
--
Спасибо.
 

Priler

WEB Developer
Просто убивай скрипт на разных этапах, так ты быстро поймешь какая строчка все порит
 

PHProgress

Новичок
Ну я еще не знаю способов лучше, и мой метод мне всегда отлично помогает искать баги и проседания в скриптах.
Проблема в том, что тогда придется много чего перебирать - и это не возможно - т.к. очень много скриптов.

Спасибо.
Попробую разобраться как этим пользоваться.
 

PHProgress

Новичок
Проблема не в этом, проблема в умении искать проседания и баги.
Вот есть сайт на joomle/bitrix/drupal/...(кому что больше нравиться) - вы о нем мало чего знаете - и как вы найдете кусок кода который грузит весь хостинг?
C mysql-запросам это понятно можно посмотреть...
На моей практике при работе с деревьями была такая ситуация, что я поменяв в одном месте foreach на for - получил ускорение в ~10 раз...

Но сейчас у меня к сожалению цель поиска в другом...
Т.к. есть предположение что идет не правильно работа с файлами...
 

Dovg

Продвинутый новичок
Priler
В этом мире есть общепринятные инструменты. Все знают, что для профайлинга в тестовом окружении следует использовать xdebug, а для поиска "затыков" на проде что-нибудь похожее на pinba.
Убивать скрипт в различных местах - это не Ъ. Если у вас один метод вызывается из разных частей приложения 100500 раз, при этом один его запуск не особо ресурсоемкий, то убийство не поможет локализовать проблему.
 

Adelf

Administrator
Команда форума
Я помню как мне дало раз в 10 ускорение, когда я в for выделил count() в отдельную переменную(xdebug кстати помог) в паре мест.
Но foreach -> for тоже непонятно. Может наоборот?
 

Фанат

oncle terrible
Команда форума
Я помню как мне дало раз в 10 ускорение, когда я в for выделил count() в отдельную переменную
И давно это было? Каунт, насколько я знаю, хранится рядом, и ничего пересчитывать не надо
NumOfElements specifies how many values are currently stored in the array.
This is also the number that count($array) returns.
 

Adelf

Administrator
Команда форума
Фанат
Ну PHP был 5.2 :) года три назад это было.
xdebug показал что куча времени уходит на count. И вышеописанная операция принесла мне полторы секунды вместо 20. (и да, чтобы никого не шокировало - это не веб-скрипт был)
 

hell0w0rd

Продвинутый новичок
PHP:
<?php

$test = [];
for($i = 0; $i < 100000; $i++)
{
    $test[] = $i;
}

$start_t = microtime(true);
for($i = 0; $i<count($test); $i++)
{
    $test[$i] += $i;
}
echo 'Time with count: '.(microtime(true) - $start_t).PHP_EOL;

$start_t = microtime(true);
$count = count($test);
for($i = 0; $i<$count; $i++)
{
    $test[$i] += $i;
}
echo 'Time without count: '.(microtime(true) - $start_t).PHP_EOL;

$start_t = microtime(true);
foreach($test as $i => $val)
{
    $test[$i] = $val + $i;
}
echo 'Time with foreach: '.(microtime(true) - $start_t).PHP_EOL;
$ php -v && php test.php
PHP 5.4.15 (cli) (built: Jun 24 2013 02:34:20)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans
Time with count: 0.10024499893188
Time without count: 0.020280122756958
Time with foreach: 0.040949106216431
Кстати splfixedarray что-то нефига не быстрый...
 

AmdY

Пью пиво
Команда форума
Логично, в циклах меняется значение значения массива. Возможно из-за этого счётчик count пересчитывается, ну а в foreach аналогично. Особенно важно помнить, когда работаешь с итераторами-коллекциями с вызовом метода, типа доктриновского
foreach($entityManager->find('Model\Article', 1) as $article)
 

Adelf

Administrator
Команда форума
Логично, в циклах меняется значение значения массива. Возможно из-за этого счётчик count пересчитывается, ну а в foreach аналогично
Вообще, пересчитывать он должен только если действительно меняется количество элементов массива.
 

hell0w0rd

Продвинутый новичок
Вообще, пересчитывать он должен только если действительно меняется количество элементов массива.
По хорошему ничего пересчитывать он не должен вообще, а при каждом изменении делать ++ или -- в отдельном поле структуры, как сказал выже Фанат
 

PHProgress

Новичок
И наверное в эту тему также будет актуально...
Вызываю функцию - и она на сайте выдает 503-ошибку...
Сайт не доступен. Убираю ее - все работает.

Как это можно по человечески посмотреть логи, и найти причину?
Здесь по идее уже проще - есть вызываемая функция (мною)...
Можно было бы быстро по ней пробежаться...
Но она содержит в себе еще много различный функций - и какая создает ошибку - не поймешь с ходу.

Спасибо.
 

hell0w0rd

Продвинутый новичок
PHProgress
xdebug же
Ну и сохранить вывод всех ошибок и в логах все это так или иначе должно сохраняться
 

PHProgress

Новичок
PHProgress
xdebug же
Ну и сохранить вывод всех ошибок и в логах все это так или иначе должно сохраняться
Думаю, что пока разберусь как ей пользоваться...
Куча времени пройдет...

Но по скриншотам понял - что она то стоит...
 

PHProgress

Новичок
php_flag display_errors 1
php_flag log_errors 1

ini_set('display_errors', 1);
error_reporting(E_ALL);

Думаю, что это подойдет...
Пока для простых решений---

А для сложных буду тогда разбираться с вышеназванной прогой.
 
Сверху