Я использую Google PHP API Client v2.0 в приложении, которое я запускаю в Google App Engine на localhost. Когда я публикую свое приложение в Google App Engine, я не получил ошибку, но это прерывисто, поэтому трудно понять, удастся ли мне просто удачи в производстве.API Google PHP: «неверный ответ от сервера api»
Мой клиент API Google пытается записать файл на свой Google Диск. Этот код хорошо работает уже пару месяцев, но сегодня утром он прекратил работать. Я проверил статус Google API, и они не сообщают об отключении. Когда я выполняю какой-либо из вызовов API, я получаю эту неопределенную реакцию на ошибку:
Фатальная ошибка: FOPEN(): Неправильный ответ от сервера API. в /Users/me/googleappengine/stuff-otherstuff-111111/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php на линии
файл не получить создан на Google Диск, так что мой вызов API проходит, но любой ответ возвращается к моему сценарию, вызывая фатальный сбой.
В течение нескольких минут он снова начал работать, теперь он снова рушится. Я не могу найти какие-либо решения для ошибки Invalid response from API server
в любом месте ... и это прерывисто. Это не похоже на мой код, но Google говорит, что он не имеет каких-либо отключений.
Что мне не хватает? Как я могу это исправить?
<?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";
}
EDIT: Мой код кажется, терпит неудачу последовательно теперь с Invalid response from API server
сообщением. Это происходит только в том месте, где код взаимодействует с Google. Эти два места - это когда я звоню refreshToken()
(что случается редко), а другое - когда я звоню create()
.
У меня был мой друг, который запустил этот точный код на своей машине с той же настройкой (насколько мы можем сказать ... тот же код, те же самые файлы, тот же маркер oauth и т. Д.), И он работает на него.
Примечания: Функция getSetting()
приведенного выше кода просто вытягивает некоторые строки из моей базы данных, которые я использую для целей конфигурации. Кроме того, необходим вызов setHttpClient()
, потому что он работает в Google App Engine, который работает на PHP 5.5, который имеет надутый CA Bundle, и он требует, чтобы я предоставил правильный.
Что может заставлять его терпеть неудачу для меня каждый раз, но работать на моего друга?
вам нужно будет выслать код, вызывающий ошибку. – DaImTo
Это не какой-то конкретный фрагмент кода. Это происходит периодически и может произойти в любой строке кода, которая делает api-вызов Google. Однажды ошибка возникает на линии, которая выполняет вызов сценариев удаленных приложений, в другой раз, когда я делаю вызов Google Диска, чтобы получить список файлов, в другой раз, когда это произойдет при вызове Google Диска, чтобы создать файл. Но тогда все те же вызовы будут работать в следующие 20 раз. Я запускаю код. –
Недостаточно информации о том, что вызывает ошибку в вопросе. Я предполагаю [это] (https://github.com/google/google-api-php-client) - клиент PHP API, который вы используете. Основываясь на ошибке 'fopen' в коде' StreamHandler', я подозреваю, что возникла ошибка при создании или чтении файла с диска. Пожалуйста, предоставьте минимальный образец кода, который может воспроизвести эту ошибку, и мы будем рады заглянуть в нее. – Nicholas