我有一个项目目前运行拉维5.7。
我有一堆物联网传感器,正在向谷歌数据存储发送数据。
我想查询这些数据,以便在我的应用程序前端显示这些数据的图表。
前端向我的项目发出请求,我的项目向google数据存储发出请求,然后构建结果并将其作为json返回到前端。
有相当一部分数据(目前是1200行),在屏幕上提取和渲染大约需要17秒。比我想的要长。
这是我获取物联网数据的当前代码:
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()
对数据存储的请求已完成
一秒钟之内
是的。但是循环遍历每一行,获取值,并将它们推送到数组中需要
14秒
是的。
我好像找不到任何方法
$result
这将允许我撤出所有的结果,并且没有文档似乎暗示这样的方法存在。
关于这个
GitHub issue
他们暗示使用
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
是的。