Symfony / доктрина, занимающая много памяти, ошибка памяти - PullRequest
1 голос
/ 02 июля 2019

Я хочу получить данные из таблицы и закодировать их в json. Я использую доктрину и построитель запросов для выбора нужных мне данных (в основном это все из таблицы) Проблема в том, что в dev все работает нормально, но когда я захожу в prod, я получаю ошибку: PHP Fatal error: Недостаточно памяти ...

Данные, которые я получаю, не более 300 КБ. В этом случае я использую маршрут для получения списка project (600B), это одна из самых маленьких таблиц. Эта таблица имеет две OneToMany ассоциации.

The database looks like this

Данные, которые я получаю, выглядят так:

[
  {
   id: "bar",
   name: "bar",
   description: "bar",
   project_date_start: "2022-01-01 00:00:00",
   project_date_end: "2019-05-21 12:19:27"
  },
  {
   id: "foo",
   name: "foo",
   description: "foo",
   project_date_start: "2021-02-02 00:00:00",
   project_date_end: "2022-02-02 00:00:00"
  }
]

Построитель запросов доктрины и функция:

    public function findAllProject()
    {
        return $this->createQueryBuilder('p')
            ->select('p.id', 'p.name', 'p.description', 'p.project_date_start', 'p.project_date_end')
            ->getQuery()
            ->getResult()
        ;
    }
        public function project(Request $request)
        { 
            $em = $this->getDoctrine()->getEntityManager();

            $projectRepo = $this->getDoctrine()->getRepository(Project::class);

            $project = $projectRepo->findAllProject();

            $data = $this->get('jms_serializer')->serialize($project, 'json');

            $response = new Response($data);
            $response->headers->set('Content-Type', 'application/json');
            $response->headers->set('Access-Control-Allow-Origin', '*');

            return $response;
        }

Я пробовал:
- переустановка Apache на сервер
- изменение значения memory_limit в php.ini
- не использовать jms_serialiser и использовать json_encode вместо

EDIT

Таким образом, ошибка определенно не поступает из сериализатора, так как ошибка выдается, когда я получаю данные из хранилища ( findAllProject () ).

Мне удалось заставить его работать за счет сокращения данных, которые я получаю, но это не решение, поскольку мне нужны все данные и, как я сказал, project - одна из самых маленьких таблиц, поэтому а когда мне нужно получить большие данные?

Если я получаю данные от Symfony, может быть, это не Symfony, а Apache, что может вызвать эту ошибку?

Кроме того, сгенерированный SQL-запрос из queryBuilder хорош (только обычный выбор)

КОНЕЦ РЕДАКТИРОВАНИЯ

Я не думаю, что это проблема как части кодирования json, так и проблемы конфигурации сервера apache (предел памяти равен -1).

Я думаю, что ассоциация таблицы project все испортила, и доктрина пытается пройтись по всей базе данных. Может быть, проблема с дизайном моей базы данных?
Например, таблица type имеет тот же размер, что и project , но не имеет ошибки нехватки памяти.

Не знаю, что еще я могу попробовать, любая идея?

1 Ответ

0 голосов
/ 11 июля 2019

Итак, я переустановил свой сервер с нуля, затем мой проект, и он заработал, поэтому я не знаю, что стало причиной этой проблемы.

...