首页 > 解决方案 > Google Sheets PHP API:读取响应慢?

问题描述

我正在使用提供的PHP library修补 Google Sheets API 。经历令人惊讶的长加载时间。我目前正在使用的工作表共有 25 页,每页大约 25 页。10KB 大小,平均 100 行 x 10 列。

在发送读取请求之前,我的应用程序会处理身份验证 ( new GoogleAuth) 和新服务 ( new Google_Service_Sheets) 的创建。这些仅在每个页面加载时发生一次。读取例程是标准 API 示例内容:

$response = $this->sheet->spreadsheets_values->get($sheet_id, $range);
$data = $response->getValues();

当我从工作表中获取单页时,大约需要 0.6 秒。当我获取 10 页时,需要 6 秒以上。无论我使用pageIdfor$range还是pageId!A1:K10例如(前 10 行),它都需要很长时间。(实际上,读取单个单元格需要相同的时间!)如果我在本地缓存这些数据并通过相同的跃点运行它,在这两种情况下,我的应用程序都需要大约 0.03 秒,所以我的端没有代码瓶颈。我的实时服务器和本地开发环境中的响应时间相同。

为 API 提供的代码库(通过 composer)包括大量材料(10K+ 文件中总共 28MB!)。我还没有心去挖掘(还)看看是否有什么我可以刮掉的东西来让它表现得体面;感觉我不应该这样做?人们会期望谷歌提供一种有点执行的 API。

请提供有关使用 PHP 或其他方式改进/解决 Google Sheets API 性能问题的任何线索、经验或建议?我很难相信它应该这么慢,与任何更复杂的家务接壤无法使用。

更新:我已经重新运行了PHP 快速入门内容,以确保这不是由我的任何代码引起的。spreadsheets_values->get()呼叫周围的滴答声之间有 0.5+ 秒的间隔。此外,尝试使用其他(更轻的)电子表格。同样的交易,数据很长时间了。

标签: phpgoogle-sheets-apigoogle-api-php-client

解决方案


根据 PHP 和 Python 的经验(感谢@iamblichus),Google Sheets API 的速度本身确实很慢。似乎没有什么可以使单个 API 往返更快地发生。在我的初始代码中,我在阅读器方法中有以下代码:

$response = $this->sheet->spreadsheets_values->get($sheet_id, $range);
$data = $response->getValues();

在某些情况下,它会被多次调用以从电子表格中访问单独的范围以进行一页渲染。这导致了无法接受的长响应时间,从而使应用程序无法使用。

一种建议的解决方案是使用spreadsheets.get,它可以一次性获取整个电子表格;然后将在本地提取所需的范围。这会导致相当多的内存和网络开销;但如果您在任何情况下都需要工作表数据的大部分,则值得考虑。

因为我只需要来自特定范围的大约 10% 的数据,所以我最终实现的解决方案使用batchGet()andgetValueRanges()方法来代替get()and getValues()。API reader方法被修改为处理字符串(一个范围)或数组(多个范围),并选择一个方法来匹配,如下:

if (!is_array($range)) {
    $response = $this->sheet->spreadsheets_values->get($sheet_id, $range);
    $data = $response->getValues();
} else {
    $response = $this->sheet->spreadsheets_values->batchGet($sheet_id, ['ranges' => $range]);
    $data = $response->getValueRanges();
}

当多个范围在数组中传递给batchGet时,API 响应将包含与指定范围匹配的响应对象数组,如下所示:

[0] => Google_Service_Sheets_ValueRange Object [
    [collection_key:protected] => values
    [majorDimension] => ROWS
    [range] => fr!A1:K181
    [values] => [ ... ]
]
[1] => Google_Service_Sheets_ValueRange Object [
...

相反,常规get调用只会返回values上面看到的数组的内容。一个接一个地获取九个范围get需要 9x 0.5+sec 或 ~5sec。使用该选项获取它们batchGet需要 1x 0.5+ 秒,即单个 API 往返的持续时间。

总之,获取的数据量与等待 Google Sheets API 响应所花费的时间无关。重要的是进行的单独 API 调用的数量。将它们捆绑到聚合请求中,以最大限度地减少应用程序中与代码无关的延迟。


推荐阅读