Существует несколько причин, почему Symfony медленный.
1. Ошибка сервера
Во-первых, это может быть ошибка сервера. Производительность сервера может помешать вашему запросу.
2. Размер данных и отложенный рендеринг
Затем следует размер данных. Как вы можете видеть на изображении ниже, запрос в одном из моих проектов имеет размер данных 50 МБ (в настоящее время около 20 000 строк).
Анализ 50 МБ в HTML может занять некоторое время, в основном из-за циклов.
Тем не менее, есть решения по этому поводу, такие как отложенный рендеринг.
Отложенный рендеринг довольно прост, вместо анализа данных в вашей ветке вы,
отправьте все данные в javascript varaible и используйте javascript для анализа / рендеринга данных после загрузки DOM.
3. Оптимизация запросов
Как я уже писал в комментарии, вы можете проверить следующий вопрос, на котором я объяснил, почему пользовательские запросы важны.
Являются ли Doctrine отношениями, влияющими на приложение производительность?
В этом вопросе вы прочтете этот порядок значения ... На самом деле это самая важная вещь.
В то время как stati c данные в ваших базах данных часто вставляются в правильном порядке
это редко имеет место для динамических c данных (данных, предоставленных пользователем в течение срока службы сайта)
Именно поэтому использование ORDER BY
в вашем запросе часто ускоряет рендеринг страницы,
при doctrine не будет выполнять дополнительные запросы самостоятельно.
Например, на одном из моих сайтов в индексе отображается около 700 записей.
Во-первых, вот количество запросов при использовании findAll()
:
Показывает 254 запроса (253 дубликата) за 144 мс плюс время рендеринга 39.
Далее , используя второй параметр findBy()
, ORDER BY
, я получаю это повторно sult:
Здесь вы можете увидеть полный запрос (скриншот большой)
Намного лучше, только 1 запрос в 8 мс и примерно в то же время рендеринга.
Но здесь я не использую никаких полей из ассоциаций.
С того момента, как я это сделаю, doctrine qui сделает дополнительный запрос и подсчитает количество запросов. и время взлетит до небес.
В конце оно вернется к чему-то вроде findAll()
И наконец, это пользовательский запрос:
В этом пользовательском запросе время запроса изменилось с 8 мс до 38 мс.
Но, в отличие от предыдущего запроса, я получил гораздо больше данных в своем результате,
что помешает doctrine выполнять дополнительный запрос.
Опять же, ORDER BY()
имеет значение в этом запросе. Без этого я стремительно вернусь к 84 запросам.
4. Partials
Когда вы делаете пользовательский запрос, вы можете загружать объекты partials вместо полных данных.
Как вы сказали в своем вопросе, поле description
, похоже, замедляет скорость загрузки. ,
с партиалами, вы можете избежать загрузки некоторых полей из таблицы, что увеличит скорость запроса.
Во-первых, вместо обычного синтаксиса вы создадите конструктор запросов:
$em=$this->getEntityManager();
$qb=$em->createQueryBuilder();
На всякий случай, я предпочитаю хранить $em
в качестве отдельной переменной (если я хочу, например, получить какой-нибудь репозиторий классов).
Затем вы можете запустить свой частичный select
. Осторожно, сначала select
не может включать в себя любые поля ассоциации:
$qb->select("partial job.{id, status, title, minimum_experience, min_salary, max_salary, zip_code, vacancies")
->from(Job::class, "job");
Затем вы можете добавить свои ассоциации:
$qb->addSelect("company")
->join("job.company", "company");
Или даже добавить частичную ассоциацию, если вы этого не делаете нужны все данные ассоциации:
$qb->addSelect("partial activitySector.{id}")
->join("job.activitySector", "activitySector");
$qb->addSelect("partial job.{id, company_id, activity_sector_id, status, active, contract_type_id, salary_type_id, workday_id, geoname_id, title, minimum_experience, min_salary, max_salary, zip_code, vacancies, show_salary");
5. Кэши
Вы также можете использовать различные кэши, например Zend OPCache для PHP, которые вы найдете в этом вопросе: Почему Symfony3 такой медленный?
Существует также SQL кэш Varni sh.
Этот обзор обо всем, что я могу поделиться, чтобы уменьшить ваше время загрузки.
Надеюсь, это окажется полезным, и вы сможете решить вашу проблему.