2017-03-08 1 views
0

Google Beispielcodes # 1Google BigQuery RunQuery Proben und die richtige Art und Weise zu verwenden, während Schlaf die queryresult

https://googlecloudplatform.github.io/google-cloud-php/#/docs/v0.21.1/bigquery/bigqueryclient?method=runQuery

$queryResults = $bigQuery->runQuery('SELECT commit FROM [bigquery-public-data:github_repos.commits] LIMIT 100'); 
$isComplete = $queryResults->isComplete(); 
while (!$isComplete) { 
    sleep(1); // let's wait for a moment... 
    $queryResults->reload(); // trigger a network request 
    $isComplete = $queryResults->isComplete(); // check the query's status 
} 
foreach ($queryResults->rows() as $row) { 
    echo $row['commit']; 
} 

In Beispielcode # 1, um zu überprüfen, ob es einige Fehler bei Google BigQuery sind Seite, dann wird PHP-Skript in einer Endlosschleife stecken, richtig?

Google Beispielcode # 2

https://github.com/GoogleCloudPlatform/php-docs-samples/blob/master/bigquery/api/src/functions/run_query.php

$queryResults = $bigQuery->runQuery(
    $query, 
    ['useLegacySql' => $useLegacySql]); 
# [END run_query] 
# [START print_results] 
if ($queryResults->isComplete()) { 
    $i = 0; 
    $rows = $queryResults->rows(); 
    foreach ($rows as $row) { 
     printf('--- Row %s ---' . PHP_EOL, ++$i); 
     foreach ($row as $column => $value) { 
      printf('%s: %s' . PHP_EOL, $column, $value); 
     } 
    } 
    printf('Found %s row(s)' . PHP_EOL, $i); 
} else { 
    throw new Exception('The query failed to complete'); 
} 

In Beispielcode # 2, könnte die BigQuery noch ausgeführt werden, bevor es abgeschlossen ist, aber unser PHP-Code bereits falsche Ausnahme zu früh werfen konnte.

Würde die richtige Lösung wie folgt aussehen?

$counter = 0; 
while (!$isComplete && $counter < 100) { 
    sleep(1); // let's wait for a moment... 
    $queryResults->reload(); // trigger a network request 
$isComplete = $queryResults->isComplete(); // check the query's status 
    #counter++; 
} 

So werden wir BigQuery Zeit geben, um die Abfrage zu beenden, aber wir werden nur für eine angemessene Zeit warten, bevor wir Fehler Ausnahme auslösen.

Antwort

1

Vor kurzem wurde ExponentialBackoff hinzugefügt wurde, überprüfen Sie die neueste Version der PHP-Bibliothek aus

Ihr Code wäre etwas wie:

$job = $bigQuery->runQueryAsJob($query); 
$backoff = new ExponentialBackoff(8); 
$backoff->execute(function() use ($job) { 
    $job->reload(); 
    if (!$job->isComplete()) { 
     throw new \Exception(); 
    } 
}); 
if (!$job->isComplete()) { 
    $this->e('Job failed to complete within the allotted time.'); 
    return false; 
} 

$queryResults = $job->queryResults(); 

if ($queryResults->isComplete()) { 
    $i = 0; 
    $rows = $queryResults->rows(); 
1

Ihr Vorschlag sieht vernünftig aus. Möglicherweise möchten Sie die Jobid in eine Warteschlange stellen und einen Threadpool-Thread/Timer in regelmäßigen Abständen überprüfen lassen, anstatt nur im Hauptthread zu blockieren und zu schlafen. (Ich bin mit PHP vertraut, also bitte verzeiht mir, wenn Sie nicht diese Art von Anwendung in der Sprache haben leider)

Verwandte Themen