2010-06-09 13 views
3

Je ne sais pas si quelqu'un a l'expérience avec l'API Google Spreadsheets ou les classes Zend_Gdata mais il vaut la peine d'aller:API Google Tableur: la mémoire a dépassé

Lorsque je tente d'insérer une valeur dans une 750 feuille de calcul de la ligne, il prend un certain temps et génère une erreur indiquant que ma limite de mémoire (128 Mo!) a été dépassée. Je l'ai également obtenu lors de l'interrogation de tous les enregistrements de cette feuille de calcul, mais cela je peux l'imagerie parce que c'est beaucoup de données. Mais pourquoi cela se produit-il lors de l'insertion d'une ligne? Ce n'est pas trop complexe, n'est-ce pas? Voici le code que j'ai utilisé:

public function insertIntoSpreadsheet($username, $password, $spreadSheetId, $data = array()) { 
    $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME; 
    $client = Zend_Gdata_ClientLogin::getHttpClient($username, $password, $service); 
    $client->setConfig(array('timeout' => 240)); 
    $service = new Zend_Gdata_Spreadsheets($client); 
    if (count($data) == 0) { 
     die("No valid data"); 
    } 
    try { 
     $newEntry = $service->insertRow($data, $spreadSheetId); 
     return true; 
    } catch (Exception $e) { 
     return false; 
    } 
} 
+0

Cette question n'a rien à voir avec AppEngine, j'ai donc supprimé la balise. –

Répondre

4

Je viens juste de me lancer aujourd'hui. Lors de l'appel de la méthode insertRow(), mon script utilisait plus de 130 Mo de mémoire insérée dans une feuille de calcul de ~ 600 enregistrements. J'ai testé cela sur framework version 1.11. En tant que solution de rechange, j'utilise l'objet client Zend HTTP existant pour envoyer un POST avec l'entrée Atom contenant les données de la ligne à insérer. J'ai suivi le protocole de Google pour adding a list row.

Voici le code que j'ai trouvé. Le paramètre $values est un tableau associatif dont les clés correspondent aux noms des colonnes de la ligne. Bien sûr, vous connaissez déjà votre $spreadsheetKey et $worksheetId (si la feuille de calcul que vous insérez est la première feuille de calcul dans la feuille de calcul, je ne suis pas sûr que son identifiant soit nécessaire).

$authService = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME; 
$httpClient = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $authService); 

function insertRow($httpClient, $spreadsheetKey, $worksheetId, $values) { 
    $entry = createEntry($values); 
    $httpClient->setUri("https://spreadsheets.google.com/feeds/list/".$spreadsheetKey."/".$worksheetId."/private/full"); 
    $response = $httpClient->setRawData($entry, 'application/atom+xml')->request('POST'); 
    return $response->getStatus() == 201; 
} 

function createEntry($values) { 
    $entry = "<entry xmlns=\"http://www.w3.org/2005/Atom\""; 
    $entry .= " xmlns:gsx=\"http://schemas.google.com/spreadsheets/2006/extended\">"; 
    foreach($values as $key => $value) { 
     $entry .= "<gsx:".$key.">".$value."</gsx:".$key.">"; 
    } 
    $entry .= "</entry>"; 
    return $entry; 
} 

Espérons que cela aide.

1

Désolé mais je ne peux pas commenter le post de Jonathan Freeland, donc je le poste comme ça.

J'ai ajouté ceci à l'intérieur de insertRow() pour le faire fonctionner.

$token = $httpClient->getClientLoginToken(); 
$httpClient->setHeaders('Authorization','GoogleLogin auth='.$token); 
$httpClient->setHeaders('Content-Type', 'application/atom+xml'); 
0

Ceci est un bug Zend_Gdata sérieux. Il télécharge la totalité de la feuille de calcul (en faisant une requête vide) et la charge dans la mémoire juste pour construire une URL de demande pour l'insertion. Je ai reported the issue ainsi qu'un correctif, mais le problème a été ignoré par les responsables de Zend et peut ne jamais être corrigé.