Yerel PHP'de Google App Engine'de çalıştırdığım bir uygulamada Google PHP API İstemcisi v2.0'ı kullanıyorum. Uygulamamı Google App Engine üretimine yayınladığımda, hatayı almadım, ancak aralıklı olduğu için üretimde şanslı olup olmadığımı bilmek zor.Google PHP API: "api sunucusundan geçersiz yanıt"
Google API istemcim Google Drive'a bir dosya yazmaya çalışıyor. Bu kod birkaç aydır iyi çalışıyor, ama bu sabah aniden çalışmayı bıraktı. Google API durumunu kontrol ettim ve herhangi bir kesinti bildirmiyorlar.
Önemli hata: fopen(): API sunucusundan geçersiz bir yanıt API çağrıları herhangi yürütmek, ben bu muğlak hata yanıtını olsun. on line /Users/me/googleappengine/stuff-otherstuff-111111/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php yılında
dosyayı Google'da oluşturulan olsun demek Drive, bu yüzden API çağrım geçiyor, ancak betiğime geri dönüş her ne olursa olsun ölümcül bir kazaya neden oluyor.
Birkaç dakika için tekrar çalışmaya başladı, şimdi tekrar çöküyor. Invalid response from API server
numaralı hataya herhangi bir çözüm bulamadım ... ve aralıklı. Kodumla ilgili bir şey görünmüyor, ancak Google herhangi bir kesinti olmadığını söylüyor.
Neyi eksik? Bunu nasıl düzeltebilirim?
<?php
include_once('code-base.php');
require_once('vendor/autoload.php');
$client = new Google_Client();
$client->setApplicationName(getSetting('APP_NAME'));
$client->setAuthConfig(json_decode(getSetting('localhost_google_client_secret'), true));
$client->setAccessType("offline");
$client->setScopes(array(Google_Service_Drive::DRIVE));
$client->setHttpClient(new GuzzleHttp\Client(['verify'=>'ca-bundle.crt']));
$accesstoken = json_decode(getSetting('localhost_google_oauth_token'), true);
$client->setAccessToken($accesstoken);
// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) {
print "access token is expired\n";
$refreshtoken = getSetting('localhost_google_refresh_token');
print "refresh token: $refreshtoken\n";
$client->refreshToken($refreshtoken);
$newtokenjson = json_encode($client->getAccessToken());
print "new token: $newtokenjson\n";
printf("before: %s\n\nafter: %s\n\n", $accessToken, $newtokenjson);
//file_put_contents($credentialsPath, $newtokenjson);
updateSetting('localhost_google_oauth_token', $newtokenjson);
}
print "after checking access token expired\n";
print "before drive service\n";
$driveservice = new Google_Service_Drive($client);
print "after drive service\n";
$parentfolderid = getSetting('GDRIVE_EXPORT_DUMP');
$title = "00005 test gdrive.csv";
$filetype = 'text/csv';
$contents = "The quick brown fox jumped over the lazy dog.";
$file = new Google_Service_Drive_DriveFile();
$file->setName($title);
$file->setDescription($title);
$file->setMimeType($filetype);
$file->setParents(array($parentfolderid));
try {
if ($contents == null) {
print "contents of file are null, creating empty file\n";
$createdFile = $driveservice->files->create($file);
print "after creating empty file\n";
} else {
$contentsarray = array('data' => $contents, 'mimeType' => $filetype, 'uploadType' => 'media');
if ($options != null) {
foreach($options as $key => $value) {
$contentsarray[$key] = $value;
}
}
print "file contents: ".var_export($contentsarray, true)."\n";
$createdFile = $driveservice->files->create($file, $contentsarray);
print "after create file with contents\n";
}
return $createdFile;
} catch (Exception $e) {
print "EXCEPTION: An error occurred: " . $e->getMessage()."\n";
}
DÜZENLEME: Kodum Invalid response from API server
mesajla şimdi sürekli başarısız gibi görünüyor. Sadece kodun Google ile iletişim kurduğu bir noktada başarısız olur. Bu iki yer, refreshToken()
(yalnızca nadiren gerçekleşir) ve diğeri ise create()
'u aradığımda.
Arkadaşımın aynı kodu (aynı kod, aynı libs, aynı oauth jetonu, vb.) Söyleyebildiğimiz kadarıyla makinede bu kodu çalıştırdım ve onun için çalışıyor.
Notlar: getSetting()
yukarıdaki kod işlevini, yalnızca veritabanları veritabanımdan yapılandırma amacıyla kullandığım bazı dizelerden alır. Ayrıca, setHttpClient()
numaralı çağrıya ihtiyaç duyulur çünkü bu, Google Drive Engine'in içinde çalışan ve çalışan bir CA Bundle'a sahip olan PHP 5.5'te çalışan ve bana uygun bir tane sunmamı gerektiren Google App Engine'in içinde çalışıyor.
Her seferinde benim için başarısız olmasına neden olabilir ama arkadaşım için çalışabilir?
bir hata neden olan kodu sonrası gerekecektir. – DaImTo
Belirli bir kod parçası değil. Aralıklı olarak gerçekleşir ve Google'a bir api araması yapan herhangi bir kod satırında gerçekleşebilir. Bir kez, bir Uzaktan Apps Komut Dosyası çağrısı yürüten satırda bir hata oluştuğunda, bir dosya listesi almak için bir Google Drive araması yaptığımda başka bir kez gerçekleşir. dosya. Ama daha sonra aynı çağrıların hepsi önümüzdeki 20 kez kod çalıştıracağım. –
Sorunda hataya neden olan şey hakkında yeterli bilgi yok. [Https://github.com/google/google-api-php-client] kullandığınız PHP API istemcisidir. "StreamHandler" kodundaki "fopen" hatasına dayanarak, hatanın Drive'dan bir dosya oluşturup okumasıyla gerçekleştiğinden şüpheleniyorum. Lütfen bu hatayı yeniden oluşturabilecek minimum bir kod örneği sağlayın ve buna bakmaktan mutlu oluruz. – Nicholas