我有一个目前正在运行 Laravel 5.7 的项目。
我有一堆物联网传感器正在将数据发送到谷歌数据存储区。
我想查询这些数据,以便我可以在我的应用程序的前端显示这些数据的图表。
前端向我的项目发出请求,我的项目向 Google Datastore 发出请求,然后构建结果以将其作为 JSON 返回到前端。
有相当多的数据(目前为 1200 行),获取并呈现在屏幕上大约需要 17 秒。这比我想要的要长。
这是我当前获取此 IoT 数据的代码:
public function fetchData()
{
dump("GDS query starting " . date("Y-m-d H:i:s"));
$query = $this->datastore->query()
->kind('IotEvent')
->filter('device_id', '=', 'abc123')
->filter('published_at', '>=', '2018-09-19T04:52:01.429Z')
->order('published_at', Query::ORDER_ASCENDING)
->projection(['current_temperature', 'target_temperature', 'published_at']);
$results = $this->datastore->runQuery($query);
dump("GDS query finished " . date("Y-m-d H:i:s"));
return($this->transformData($results));
}
private function transformData($results)
{
dump("GDS transform starting " . date("Y-m-d H:i:s"));
$data = [];
foreach ($results as $result) {
array_push($data, $result->get());
}
dump("GDS transform finished " . date("Y-m-d H:i:s"));
return $data;
}
根据dump()
s,对 Datastore 的请求在一秒钟内完成。但是遍历每一行,获取值并将它们推送到数组需要14 秒。
我似乎找不到任何$result
可以让我提取所有结果的方法,而且似乎没有文档暗示存在这样的方法。
在这个GitHub 问题上,他们暗示了iterator_to_array()
我以前从未听说过的使用方法。但是,像下面这样使用它只会在我的前端返回一堆空的 JSON 对象:
private function transformData($results)
{
dump("GDS transform starting " . date("Y-m-d H:i:s"));
$data = iterator_to_array($results, false);
dump("GDS transform finished " . date("Y-m-d H:i:s"));
return $data;
}
有没有一种方法可以使这个过程更快,或者我可以做些什么来优化当前循环每一行的过程?一旦投入生产,每个获取数据的请求预计会返回大约 5000 行,因此是我当前获取的 5 倍。
我正在使用官方的Google Datastore Library。