StreamedResponse не работает

У меня длительный процесс импорта, и я пытаюсь использовать новый StreamedResponse доступен в Symfony 2.1, чтобы сообщить пользователю некоторые отзывы о задаче, но ответ не передается в потоковом режиме (я получаю весь контент сразу в конце обработки). Это мой код в моем контроллере:

            $em = $this->getDoctrine()->getEntityManager();
            $response = new StreamedResponse();
            $response->setCallback(function () use ($em) {
                $file = fopen(sys_get_temp_dir().'/categories.txt', 'r');
                $lineNum = 0;
                while ($line = fgets ($file)) {
                    $category = new Category();
                    $fields = explode("\t",$line);
                    $category->setFullId($fields[0]);
                    $category->setName($fields[2]);
                    $category->setFullName($fields[4]);
                    $em->persist($category);
                    if ($lineNum%100==0) {
                        echo 'Processing Line: '.$lineNum.'<br>';
                        flush();                            
                        $em->flush();
                    }
                    $lineNum++;
                }
                fclose($file);
            });
            return $response;                 

Есть идеи, что может быть не так?


person Carlos Granados    schedule 30.08.2012    source источник


Ответы (1)


Хорошо, я нашел это: вам нужно вызвать и ob_flush(), и flush().

person Carlos Granados    schedule 30.08.2012
comment
Потрясающий! В чем причина этого? Я никогда раньше не слышал об ob_flush. Отличная работа! - person Mick; 30.08.2012
comment
Диапазон функций ob_ устанавливает внутренний буфер, так что любой вывод, сделанный кодом, выводится в этот буфер. Это используется, например, ответом, чтобы перехватить весь вывод из шаблонов и т. д., а затем перенаправить его обратно в браузер. Вот почему вам нужно позвонить в этой ситуации - person Carlos Granados; 30.08.2012
comment
@CarlosGranados, но Response не использует функцию ob_start;) Я думаю, у вас просто включена output_buffering в конфигурации php. - person meze; 30.08.2012
comment
Да, у меня включена функция output_buffering, но это не имеет отношения к ob_buffer. - person Carlos Granados; 30.08.2012
comment
Да, включение буферизации вывода аналогично вызову ob_start в начале вашего кода. - person Maerlyn; 30.08.2012
comment
Я этого не знал!! Я думал, что это разные буфера! Спасибо за это - person Carlos Granados; 30.08.2012