Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GoogleSheetsPHPAPI:读响应慢?_Php_Google Sheets Api_Google Api Php Client - Fatal编程技术网

GoogleSheetsPHPAPI:读响应慢?

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

我正在使用提供的工具修补GoogleSheetsAPI。经历了惊人的长加载时间。我目前正在处理的工作表共有25页,每页大小约为10KB,平均为100行x 10列

在发送读取请求之前,我的应用程序处理身份验证(
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%的数据,因此我最终实现的解决方案使用and
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();
}
[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%的数据,因此我最终实现的解决方案使用and
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();
}
[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的数量。将它们捆绑到聚合请求中,以最小化应用程序中与代码无关的延迟。

我可以问一下您的问题吗?我不得不为我糟糕的英语水平道歉。我无法理解你的
页面