5

Я использую 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, и он требует, чтобы я предоставил правильный.

Что может заставлять его терпеть неудачу для меня каждый раз, но работать на моего друга?

+0

вам нужно будет выслать код, вызывающий ошибку. – DaImTo

+0

Это не какой-то конкретный фрагмент кода. Это происходит периодически и может произойти в любой строке кода, которая делает api-вызов Google. Однажды ошибка возникает на линии, которая выполняет вызов сценариев удаленных приложений, в другой раз, когда я делаю вызов Google Диска, чтобы получить список файлов, в другой раз, когда это произойдет при вызове Google Диска, чтобы создать файл. Но тогда все те же вызовы будут работать в следующие 20 раз. Я запускаю код. –

+0

Недостаточно информации о том, что вызывает ошибку в вопросе. Я предполагаю [это] (https://github.com/google/google-api-php-client) - клиент PHP API, который вы используете. Основываясь на ошибке 'fopen' в коде' StreamHandler', я подозреваю, что возникла ошибка при создании или чтении файла с диска. Пожалуйста, предоставьте минимальный образец кода, который может воспроизвести эту ошибку, и мы будем рады заглянуть в нее. – Nicholas

ответ

-1

Прежде чем вы сможете ответить «что вызывает эту ошибку», вам сначала нужно ответить «что такое ошибка». Обычно переходные сетевые ошибки являются нормальными и не приводят к сбою приложения с фатальной ошибкой, даже если они происходят постоянно (например, в случае сбоя или в вашем случае - локальной проблемы).

Guzzle, конечно, не относится к ошибкам как к фатальным, так как он sets its default HTTP context to ignore_errors => true (и в любом случае возвращает ответ). google-api-php-client не изменяет поведение по умолчанию ignore_errors, равно google-api-php-client-services, ни сервер разработки, ни PHP SDK. Текст Invalid response from API server не отображается нигде в исходном коде для любого из вышеупомянутых проектов и не является зарегистрированным сообщением об ошибке от любого из API.

Так что, если предположить, что источник Invalid response from API server находится где-то внутри самого кода приложения. Я предполагаю, что в коде приложения есть подобный блок обработки исключений для всех исключений, так как вы выше, который проглатывает какой-либо ответ без успеха и выдает непрозрачное сообщение об ошибке как фатальное.

Лучший ответ, который я могу дать, - искать источник сообщения об ошибке в вашем коде, а затем сообщить ему, чтобы регистрировать данные, а не скрывать их, что может показать, что является основной проблемой и как ее исправить.

+0

Этот ответ кажется очень похожим:« Этого не должно быть ... и если это так, это не имеет большого значения ». Не очень полезно. –

+0

Нет, мой ответ заключается в том, что случайный не-200 ответ от облачного API нормален и должен обрабатываться изящно. Дело в том, что приложение вместо этого рушится из-за упомянутой ошибки, как сообщает плакат, но это не API, ни клиентская библиотека, ни SDK, который заставляет приложение терпеть крах, поэтому логический вывод заключается в том, чтобы посмотрите на код приложения. – Adam

+0

Но он не описывает случайную проблему, он описывает проблему, которая происходит на такой высокой частоте, что она будет полной демонстрацией для любого производственного приложения. Код приложения включен выше, и он не должен прерывать все, половину или даже треть времени. Эта частота неудач нелепо. –