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;
}
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. –