diff --git a/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php b/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php index 48adfc1..55a495c 100644 --- a/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php +++ b/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php @@ -186,6 +186,10 @@ public function renderResponse(array $main_content, Request $request, RouteMatch if (count($page_parts) !== 2) { throw new \LogicException("You need to have only one body or one tag in your html.html.twig template file."); } + + // Support streaming on NGINX + php-fpm (nginx >= 1.5.6). + header('X-Accel-Buffering: no'); + print $page_parts[0]; // @todo Add helper function. @@ -197,9 +201,6 @@ public function renderResponse(array $main_content, Request $request, RouteMatch EOF; print $behaviors; - // Support streaming on NGINX + php-fpm (nginx >= 1.5.6). - header('X-Accel-Buffering: no'); - ob_end_flush(); flush(); diff --git a/core/lib/Drupal/Core/Render/RenderCache.php b/core/lib/Drupal/Core/Render/RenderCache.php index 20a4298..48bb480 100644 --- a/core/lib/Drupal/Core/Render/RenderCache.php +++ b/core/lib/Drupal/Core/Render/RenderCache.php @@ -182,7 +182,7 @@ protected function checkPlaceholders(array $placeholders) { * The render array placeholder. */ protected function createRenderCacheArrayPlaceholder(array $elements, $data = FALSE) { - $render_cache_array = array_intersect_key($elements, ['#cache' => 0, '#pre_render_cache' => 1]); + $render_cache_array = array_intersect_key($elements, ['#cache' => 0, '#pre_render_cache' => 1, '#render_strategies' => 2]); $placeholder_keys = []; if (isset($render_cache_array['#cache']['keys'])) { @@ -191,6 +191,11 @@ protected function createRenderCacheArrayPlaceholder(array $elements, $data = FA if (isset($render_cache_array['#pre_render_cache'])) { $placeholder_keys = array_merge($placeholder_keys, array_keys($render_cache_array['#pre_render_cache'])); } + // Make it simpler for strategies to check supported strategies. + if (!empty($render_cache_array['#render_strategies'])) { + $render_cache_array['#render_strategies'] = array_combine($render_cache_array['#render_strategies'], $render_cache_array['#render_strategies']); + } + $placeholder_keys[] = hash('sha1', serialize($render_cache_array)); // @todo Use hash of $pre_bubbling_elements['#pre_render_cache','#cache']? diff --git a/core/lib/Drupal/Core/Render/Renderer.php b/core/lib/Drupal/Core/Render/Renderer.php index 7bd26e5..f605ae0 100644 --- a/core/lib/Drupal/Core/Render/Renderer.php +++ b/core/lib/Drupal/Core/Render/Renderer.php @@ -555,7 +555,7 @@ protected function processPlaceholders(array &$elements) { // @todo Render strategies will need to take care of this. global $process_remaining_placeholders; - if (isset($process_remaining_placeholders)) { + if (isset($process_remaining_placeholders) || (isset($placeholder_elements['#render_strategies']['single_flush']))) { $markup = $this->renderPlaceholder($placeholder, $placeholder_elements); $elements['#markup'] = str_replace('
', $markup, $elements['#markup']); unset($elements['#cache']['placeholders'][$placeholder]);