GoogleSheetsPHPAPI:读响应慢?
我正在使用提供的工具修补GoogleSheetsAPI。经历了惊人的长加载时间。我目前正在处理的工作表共有25页,每页大小约为10KB,平均为100行x 10列 在发送读取请求之前,我的应用程序处理身份验证(GoogleSheetsPHPAPI:读响应慢?,php,google-sheets-api,google-api-php-client,Php,Google Sheets Api,Google Api Php Client,我正在使用提供的工具修补GoogleSheetsAPI。经历了惊人的长加载时间。我目前正在处理的工作表共有25页,每页大小约为10KB,平均为100行x 10列 在发送读取请求之前,我的应用程序处理身份验证(new GoogleAuth)和新服务的创建(new Google\u service\u Sheets)。这些操作仅在每页加载时发生一次。读取例程是标准API示例: $response = $this->sheet->spreadsheets_values->get($s
new GoogleAuth
)和新服务的创建(new Google\u service\u Sheets
)。这些操作仅在每页加载时发生一次。读取例程是标准API示例:
$response = $this->sheet->spreadsheets_values->get($sheet_id, $range);
$data = $response->getValues();
当我从工作表中取出一页时,需要约0.6秒。当我拿到10页时,需要6秒以上的时间。无论我是使用pageId
作为$range
还是pageId!A1:K10
例如(前10行),所需时间与前10行相同。(事实上,读取一个单元格需要相同的时间!)如果我在本地缓存这些数据并通过相同的跃点运行它,在这两种情况下,我的应用程序都需要大约0.03秒,因此在我的终端没有代码瓶颈。在我的live server和本地开发环境中,响应时间是相同的
API附带的代码库(通过composer)包含大量的材料(10K+文件中的总容量为28MB!)。我还不忍心去钻研,看看是否有什么东西我可以剃掉,让这场演出有几分体面;感觉我不该这么做?人们可能会期望谷歌提供一个在某种程度上可以执行的API
关于改进/排除Google Sheets API性能的任何线索、经验或建议,请使用PHP或其他方式?我很难相信它会这么慢,再复杂的家务活也不能用了
更新:我已经用时间刻度重新运行了这些东西,以确保这不是由我的任何代码引起的。
spreadsheets\u values->get()
调用周围的刻度之间有0.5秒以上的间隔。此外,还尝试了其他(更轻的)电子表格。同样的交易,数据的长期存在。基于PHP和Python的经验(感谢@iamblichus),Google Sheets API的速度本身确实是缓慢的。似乎没有什么可以让单个API的往返更快。在我的初始代码中,我在reader方法中有以下代码:
$response = $this->sheet->spreadsheets_values->get($sheet_id, $range);
$data = $response->getValues();
在某些情况下,会多次调用它,以便从电子表格中访问单独的范围以进行一页渲染。这导致了不可接受的长响应时间,使应用程序无法使用
一个建议的解决方案是使用电子表格.get
,它可以一次性获取整个电子表格;然后在本地提取所需的范围。这会导致相当大的内存和网络开销;但是,如果您在任何情况下都需要工作表的大部分数据,则值得考虑
由于我只需要特定范围中大约10%的数据,因此我最终实现的解决方案使用andgetValueRanges()
方法来代替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();
}
[0] => Google_Service_Sheets_ValueRange Object [
[collection_key:protected] => values
[majorDimension] => ROWS
[range] => fr!A1:K181
[values] => [ ... ]
]
[1] => Google_Service_Sheets_ValueRange Object [
...
当在一个数组中将多个范围传递给batchGet
时,API响应将包含一个与指定范围匹配的响应对象数组,如下所示:
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();
}
[0] => Google_Service_Sheets_ValueRange Object [
[collection_key:protected] => values
[majorDimension] => ROWS
[range] => fr!A1:K181
[values] => [ ... ]
]
[1] => Google_Service_Sheets_ValueRange Object [
...
相反,常规的get
调用只会返回上面看到的值数组的内容。使用get
一个接一个地获取九个范围需要9 x 0.5秒或~5秒。使用batchGet
选项获取它们需要1x 0.5秒以上的时间,即单个API往返的时间
总之,获取的数据量与等待Google Sheets API响应的时间无关。重要的只是单独调用API的数量。将它们捆绑到聚合请求中,以最小化应用程序中与代码无关的延迟。基于PHP和Python的经验(感谢@iamblichus),Google Sheets API本身的速度确实很慢。似乎没有什么可以让单个API的往返更快。在我的初始代码中,我在reader方法中有以下代码:
$response = $this->sheet->spreadsheets_values->get($sheet_id, $range);
$data = $response->getValues();
在某些情况下,会多次调用它,以便从电子表格中访问单独的范围以进行一页渲染。这导致了不可接受的长响应时间,使应用程序无法使用
一个建议的解决方案是使用电子表格.get
,它可以一次性获取整个电子表格;然后在本地提取所需的范围。这会导致相当大的内存和网络开销;但是,如果您在任何情况下都需要工作表的大部分数据,则值得考虑
由于我只需要特定范围中大约10%的数据,因此我最终实现的解决方案使用andgetValueRanges()
方法来代替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();
}
[0] => Google_Service_Sheets_ValueRange Object [
[collection_key:protected] => values
[majorDimension] => ROWS
[range] => fr!A1:K181
[values] => [ ... ]
]
[1] => Google_Service_Sheets_ValueRange Object [
...
当在一个数组中将多个范围传递给batchGet
时,API响应将包含一个与指定范围匹配的响应对象数组,如下所示:
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();
}
[0] => Google_Service_Sheets_ValueRange Object [
[collection_key:protected] => values
[majorDimension] => ROWS
[range] => fr!A1:K181
[values] => [ ... ]
]
[1] => Google_Service_Sheets_ValueRange Object [
...
相反,常规的get
调用只会返回上面看到的值数组的内容。使用get
一个接一个地获取九个范围需要9 x 0.5秒或~5秒。使用batchGet
选项获取它们需要1x 0.5秒以上的时间,即单个API往返的时间
总之,获取的数据量与等待Google Sheets API响应的时间无关。重要的只是单独调用API的数量。将它们捆绑到聚合请求中,以最小化应用程序中与代码无关的延迟。我可以问一下您的问题吗?我不得不为我糟糕的英语水平道歉。我无法理解你的页面