Tutti i servizi dell'API Google Ads hanno impostazioni predefinite, inclusi i timeout, che vengono utilizzate dal trasporto. Qualsiasi servizio di una determinata versione dell'API Google Ads ha un file JSON dedicato con queste impostazioni predefinite definite a livello di servizio e metodo. Ad esempio, puoi trovare i file di configurazione delle risorse di servizio per l'ultima versione dell'API Google Ads su GitHub.
Le impostazioni predefinite sono adeguate per la maggior parte dei casi d'uso, ma a volte potrebbe essere necessario eseguirne l'override. La libreria client per PHP supporta l'override
delle impostazioni di timeout per chiamata (specificato in millisecondi utilizzando l'opzione timeoutMillis)
sia per lo streaming lato server che per le chiamate unarie.
Anche se puoi configurare valori di timeout elevati (ad esempio 2 ore o più) nella
libreria client, i proxy di rete sottostanti o il server API potrebbero comunque terminare
le richieste a lunga esecuzione in anticipo e restituire un errore di stato DEADLINE_EXCEEDED.
Ignorare i timeout per una chiamata di streaming del server
L'unico metodo di servizio dell'API Google Ads che utilizza una chiamata di streaming del server è
GoogleAdsService.SearchStream. Per ignorare il timeout predefinito, passa timeoutMillis (in millisecondi) nell'array di opzioni di chiamata facoltative quando chiami il metodo:
private static function makeServerStreamingCall( GoogleAdsClient $googleAdsClient, int $customerId ) { $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); // Creates a query that retrieves all campaign IDs. $query = 'SELECT campaign.id FROM campaign'; $output = ''; try { // Issues a search stream request by setting a custom client timeout. /** * @var GoogleAdsServerStreamDecorator $stream */ $stream = $googleAdsServiceClient->searchStream( SearchGoogleAdsStreamRequest::build($customerId, $query), [ // Any server streaming call has a default timeout setting. For this // particular call, the default setting can be found in the following file: // https://github.com/googleads/google-ads-php/blob/master/src/Google/Ads/GoogleAds/V25/Services/resources/google_ads_service_client_config.json. // // When making a server streaming call, an optional argument is provided and can // be used to override the default timeout setting with a given value. 'timeoutMillis' => self::CLIENT_TIMEOUT_MILLIS ] ); // Iterates over all rows in all messages and collects the campaign IDs. foreach ($stream->iterateAllElements() as $googleAdsRow) { /** * @var GoogleAdsRow $googleAdsRow */ $output .= ' ' . $googleAdsRow->getCampaign()->getId(); } print 'The server streaming call completed before the timeout.' . PHP_EOL; } catch (ApiException $exception) { if ($exception->getStatus() === ApiStatus::DEADLINE_EXCEEDED) { print 'The server streaming call did not complete before the timeout.' . PHP_EOL; } else { // Bubbles up if the exception is not about timeout. throw $exception; } } finally { print 'All campaign IDs retrieved:' . ($output ?: ' None') . PHP_EOL; } }
Eseguire l'override dei timeout per una chiamata unaria
La maggior parte dei metodi di servizio dell'API Google Ads utilizza chiamate unarie; esempi tipici sono
GoogleAdsService.Search e
GoogleAdsService.Mutate. Per ignorare il timeout predefinito, passa
timeoutMillis (in millisecondi) nell'array di opzioni di chiamata facoltative quando
chiami il metodo:
private static function makeUnaryCall(GoogleAdsClient $googleAdsClient, int $customerId) { $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); // Creates a query that retrieves all campaign IDs. $query = 'SELECT campaign.id FROM campaign'; $output = ''; try { // Issues a search request by setting a custom client timeout. $response = $googleAdsServiceClient->search( SearchGoogleAdsRequest::build($customerId, $query), [ // Any unary call is retryable and has default retry settings. // Complete information about these settings can be found here: // https://googleapis.github.io/gax-php/master/Google/ApiCore/RetrySettings.html. // For this particular call, the default retry settings can be found in the // following file: // https://github.com/googleads/google-ads-php/blob/master/src/Google/Ads/GoogleAds/V25/Services/resources/google_ads_service_client_config.json. // // When making an unary call, an optional argument is provided and can be // used to override the default retry settings with given values. 'retrySettings' => [ // Sets the maximum accumulative timeout of the call, it includes all tries. 'totalTimeoutMillis' => self::CLIENT_TIMEOUT_MILLIS, // Sets the timeout that is used for the first try to one tenth of the // maximum accumulative timeout of the call. // Note: This overrides the default value and can lead to // RequestError.RPC_DEADLINE_TOO_SHORT errors when too small. We recommend // to do it only if necessary. 'initialRpcTimeoutMillis' => self::CLIENT_TIMEOUT_MILLIS / 10, // Sets the maximum timeout that can be used for any given try to one fifth // of the maximum accumulative timeout of the call (two times greater than // the timeout that is used for the first try). 'maxRpcTimeoutMillis' => self::CLIENT_TIMEOUT_MILLIS / 5 ] ] ); // Iterates over all rows in all messages and collects the campaign IDs. foreach ($response->iterateAllElements() as $googleAdsRow) { /** * @var GoogleAdsRow $googleAdsRow */ $output .= ' ' . $googleAdsRow->getCampaign()->getId(); } print 'The unary call completed before the timeout.' . PHP_EOL; } catch (ApiException $exception) { if ($exception->getStatus() === ApiStatus::DEADLINE_EXCEEDED) { print 'The unary call did not complete before the timeout.' . PHP_EOL; } else { // Bubbles up if the exception is not about timeout. throw $exception; } } finally { print 'All campaign IDs retrieved:' . ($output ?: ' None') . PHP_EOL; } }