我的最终目标是缓存当前通过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上)
答案 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;
}