缓存一个StreamedResponse?

时间:2018-06-27 18:34:46

标签: php caching drupal-8

我的最终目标是缓存当前通过StreamingResponse服务的昂贵操作和大量输出。怎么样?请记住,我对Drupal比较陌生。

我创建了一个API端点,该端点可以按需生成输出。输出大小可能会有所不同-足以让我想要流式传输响应-并且可以半定期更改(例如每天一次或两次)。

流媒体基本上是免费的(感谢Drupal / Symfony!),我的工作原理是:

use Symfony\Component\HttpFoundation\StreamedResponse;

...

public function GETLargishOutputEndpoint ( ) {
  $response = new StreamedResponse(function() {
    # Generate output in streaming fashion, say a large Lorem Ipsum
    while ( $someCriterion ) {
      echo "Lorem ipsum dolor sit amet, consectetur ...";
      $someCriterion = ... # assign true or false
    }
  });

  $response->headers->set('Content-Type', 'x-application/lorem+ipsum');

  return $response;
}

输出的创建成本非常高,我希望每次更改仅产生一次成本(如果除了用户体验和下载时间延迟之外,没有其他原因)。但是,如何使用StreamedResponse?到目前为止,Google还不是我的朋友。

我愿意接受必须手动实施并且不能使用CacheableResponseInterface,但是希望我缺少(非)显而易见的内容。

(在Drupal 8.5上)

1 个答案:

答案 0 :(得分:0)

我还没有弄清楚如何同时使用StreamedResponse和从缓存中提取。对于我们当前的场景,从缓存中拉出来是一个胜利。如果生成的输出太大,这将是不可行的。

同时,工作代码归结为基本的“从缓存中拉出”范例:

use Symfony\Component\HttpFoundation\StreamedResponse;

...

public function GETLargishOutputEndpoint ( int $nid ) {
  $cid = "some_unique:$nid";

  if ( ! ($cache = \Drupal::cache()->get( $cid ) ) {
    $response = new Response( $cache->data );
  }
  else {
    $node = \Drupal\node\Entity\Node::load( $nid );
    $cache_tags = $node->getCacheTags();

    $data = SomeExpensiveOperation( $nid );

    \Drupal::cache()->set($cid, $data, \Drupal\Core\Cache\CacheBackendInterface::CACHE_PERMANENT, $cache_tags);

    $response = new Response( $data );
  }

  return $response;
}