Google 张 PHP API:读取响应慢?
Google Sheets PHP API: Slow Read Response?
我正在使用提供的 PHP library 修改 Google 表格 API。体验出奇的长加载时间。我目前正在使用的 sheet 总共有 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();
当我从 sheet 获取单个页面时,需要大约 0.6 秒。当我获取 10 页时,需要 6 秒以上。无论我将 pageId
用于 $range
,还是使用 pageId!A1:K10
(例如前 10 行),都需要很长时间。 (事实上 ,读取单个单元格需要相同的时间!)如果我在本地缓存此数据并通过相同的跃点 运行 它,在这两种情况下我的应用程序都需要大约 0.03 秒,所以我的代码没有瓶颈结尾。我的实时服务器和本地开发环境中的响应时间相同。
API(通过 composer)发布的代码库包括大量 material(10K+ 个文件共 28MB!)。我还没有勇气(还)深入研究,看看是否有什么我可以剃掉的,让这个表现半体面;感觉我不应该这样做?人们会期望 Google 提供一个 API 有点执行。
关于 improving/troubleshooting Google Sheets API 性能的任何线索、经验或建议,PHP 或其他?我很难相信它应该这么慢,与任何更复杂的杂务接壤。
更新: 我已经重新运行 PHP Quickstart 带有时间标记的内容以确保这不是由我的任何代码引起的。 spreadsheets_values->get()
调用前后的刻度之间有 0.5+ 秒的间隔。此外,尝试使用其他(更轻的)spreadsheets。同样的道理,数据来了很久了。
根据 PHP 和 Python 的经验(感谢 @iamblichus),Google Sheets API 速度本身确实比较慢。似乎您无法做任何事情来加快单次 API 往返的速度。在我的初始代码中,我在 reader 方法中有以下代码:
$response = $this->sheet->spreadsheets_values->get($sheet_id, $range);
$data = $response->getValues();
在某些情况下,它会被多次调用以从一个页面呈现的跨页sheet 访问不同的范围。这导致响应时间过长,导致应用程序无法使用。
一个建议的解决方案是使用spreadsheets.get
,它可以一次性获取整个点差sheet;然后一个人会在本地提取所需的范围。这会导致相当多的内存和网络开销;但如果您在任何情况下都需要 sheet 的大部分数据,则值得考虑。
因为我只需要来自特定范围的大约 10% 的数据,所以我最终实施的解决方案使用 batchGet()
和 getValueRanges()
方法代替 get()
和 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
调用只会 return 上述 values
数组的内容。使用 get
一个接一个地获取九个范围需要 9x 0.5+秒或 ~5 秒。使用 batchGet
选项获取它们需要 1x 0.5+sec,这是单次 API 往返的持续时间。
总而言之,获取的数据量与等待 Google 表格 API 响应所花费的时间无关紧要。重要的只是单独 API 调用的数量。将它们捆绑到聚合请求中,以最大限度地减少应用程序中与代码无关的延迟。
我正在使用提供的 PHP library 修改 Google 表格 API。体验出奇的长加载时间。我目前正在使用的 sheet 总共有 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();
当我从 sheet 获取单个页面时,需要大约 0.6 秒。当我获取 10 页时,需要 6 秒以上。无论我将 pageId
用于 $range
,还是使用 pageId!A1:K10
(例如前 10 行),都需要很长时间。 (事实上 ,读取单个单元格需要相同的时间!)如果我在本地缓存此数据并通过相同的跃点 运行 它,在这两种情况下我的应用程序都需要大约 0.03 秒,所以我的代码没有瓶颈结尾。我的实时服务器和本地开发环境中的响应时间相同。
API(通过 composer)发布的代码库包括大量 material(10K+ 个文件共 28MB!)。我还没有勇气(还)深入研究,看看是否有什么我可以剃掉的,让这个表现半体面;感觉我不应该这样做?人们会期望 Google 提供一个 API 有点执行。
关于 improving/troubleshooting Google Sheets API 性能的任何线索、经验或建议,PHP 或其他?我很难相信它应该这么慢,与任何更复杂的杂务接壤。
更新: 我已经重新运行 PHP Quickstart 带有时间标记的内容以确保这不是由我的任何代码引起的。 spreadsheets_values->get()
调用前后的刻度之间有 0.5+ 秒的间隔。此外,尝试使用其他(更轻的)spreadsheets。同样的道理,数据来了很久了。
根据 PHP 和 Python 的经验(感谢 @iamblichus),Google Sheets API 速度本身确实比较慢。似乎您无法做任何事情来加快单次 API 往返的速度。在我的初始代码中,我在 reader 方法中有以下代码:
$response = $this->sheet->spreadsheets_values->get($sheet_id, $range);
$data = $response->getValues();
在某些情况下,它会被多次调用以从一个页面呈现的跨页sheet 访问不同的范围。这导致响应时间过长,导致应用程序无法使用。
一个建议的解决方案是使用spreadsheets.get
,它可以一次性获取整个点差sheet;然后一个人会在本地提取所需的范围。这会导致相当多的内存和网络开销;但如果您在任何情况下都需要 sheet 的大部分数据,则值得考虑。
因为我只需要来自特定范围的大约 10% 的数据,所以我最终实施的解决方案使用 batchGet()
和 getValueRanges()
方法代替 get()
和 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
调用只会 return 上述 values
数组的内容。使用 get
一个接一个地获取九个范围需要 9x 0.5+秒或 ~5 秒。使用 batchGet
选项获取它们需要 1x 0.5+sec,这是单次 API 往返的持续时间。
总而言之,获取的数据量与等待 Google 表格 API 响应所花费的时间无关紧要。重要的只是单独 API 调用的数量。将它们捆绑到聚合请求中,以最大限度地减少应用程序中与代码无关的延迟。