2012-10-02 4 views
0

Je ne reçois aucune sorte de réponse de google. Je dirais que la requête réussit 99% du temps mais j'ai récemment commencé à remarquer que la requête ne réussit pas. Il n'échoue pas car il n'y a pas de réponse retournée pour indiquer un échec: pas de code d'état HTTP, pas de réponse XML ... nada.En quoi une requête PUT peut-elle échouer sur Google Cloud Storage?

Cela peut-il être causé par un délai d'attente trop court? Le mien est fixé à 10s

Voici comment mon code ressemble:

public function putObject($objectPath, $bucket, $accessToken, $metaHeaders) 
{ 
    $version_header = "x-goog-api-version: 2"; 
    $project_header = "x-goog-project-id: ".$this->projectID; 
    $timestamp  = date("r"); 

    $url = 'https://'.$bucket.'.commondatastorage.googleapis.com/object'; 

    $fp = fopen($objectPath, 'r'); 

    $headers = array('Host: '.$bucket.'.commondatastorage.googleapis.com', 
        'Date: '.$timestamp, $version_header, 'Content-Type: text/plain', 
        $project_header, 'Content-Length: '.filesize($objectPath), 
        'Authorization: OAuth '.$accessToken); 
    if(isset($metaHeaders)) 
    { 
     foreach($metaHeaders as $metaHeader) 
     { 
      array_push($headers,$metaHeader); 
     } 
    } 

    $c = curl_init(); 
    curl_setopt($c, CURLOPT_URL, $url); 
    curl_setopt($c, CURLOPT_PUT, 1); 
    curl_setopt($c, CURLOPT_INFILE, $fp); 
    curl_setopt($c, CURLOPT_INFILESIZE, filesize($objectPath)); 
    curl_setopt($c, CURLOPT_HEADER, 1); 
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($c, CURLOPT_CUSTOMREQUEST, "PUT"); 
    curl_setopt($c, CURLOPT_TIMEOUT, 10); //timeout in 10s 
    curl_setopt($c, CURLOPT_HTTPHEADER, $headers); 
    $response = curl_exec($c); 
    curl_close($c); 
    fclose($fp); 

    // split up the response into header and xml body 
    list($header, $xml) = explode("\r\n\r\n", $response, 2); 
    // tokenize 
    $status = strtok($header, "\r\n"); 

    if(stristr($status,"200 OK")) 
    { 
     //success 
     $result = "success"; 
     //check xml object for specific bucket creation errors 

    } 
    else 
    { 
     //failed 
     $result = "fail"; 
     //check xml object for specific bucket creation errors 

    } 

    return $result; 
} 

Répondre

1

10 secondes peuvent ne pas être suffisant en fonction de la taille de la demande. Je commence mon délai d'attente à 60 secondes et l'augmente si les demandes prennent beaucoup de temps. Et, ceci est l'Internet. Certaines demandes expireront et devront être réessayées, mais cela devrait être beaucoup moins de 0,001% du temps.

+0

Merci pour votre réponse Maldred. La taille de la requête est à peine 300 octets, c'est pourquoi j'ai mis le timeout à 10s. Mais je vais suivre vos conseils et mettre en œuvre un arrêt exponentiel et réessayer en cas d'échec. –