Php 在没有登录验证的情况下运行BigQuery

Php 在没有登录验证的情况下运行BigQuery,php,authentication,google-bigquery,Php,Authentication,Google Bigquery,我试图通过php语言运行bigquery。 所以首先,我能够通过身份验证成功地运行bigquery(这意味着首先它要求登录,然后查询才会运行)。 我的问题是,我可以在没有身份验证的情况下在bigquery中运行查询吗? 提前感谢这里有一个代码 使用 异步运行作业 显示正在运行的作业ID和状态 您需要: 已创建服务帐户(类似于…@developer.gserviceaccount.com) 您的密钥文件(.p12) 服务\u令牌\u文件\u位置(用于存储握手产生的JSON的可写路径,有效期为

我试图通过php语言运行bigquery。 所以首先,我能够通过身份验证成功地运行bigquery(这意味着首先它要求登录,然后查询才会运行)。 我的问题是,我可以在没有身份验证的情况下在bigquery中运行查询吗? 提前感谢

这里有一个代码

  • 使用
  • 异步运行作业
  • 显示正在运行的作业ID和状态
您需要:

  • 已创建服务帐户(类似于
    …@developer.gserviceaccount.com
  • 您的密钥文件(
    .p12
  • 服务\u令牌\u文件\u位置(用于存储握手产生的JSON的可写路径,有效期为1h)
代码示例:

function getGoogleClient($data = null) {
    global $service_token_file_location, $key_file_location, $service_account_name;
    $client = new Google_Client();
    $client->setApplicationName("Client_Library_Examples");

    $old_service_token = null;
    $service_token = @file_get_contents($service_token_file_location);
    $client->setAccessToken($service_token);
    $key = file_get_contents($key_file_location);
    $cred = new Google_Auth_AssertionCredentials(
            $service_account_name, array(
        'https://www.googleapis.com/auth/bigquery',
        'https://www.googleapis.com/auth/devstorage.full_control'
            ), $key
    );
    $client->setAssertionCredentials($cred);
    if ($client->getAuth()->isAccessTokenExpired()) {
        $client->getAuth()->refreshTokenWithAssertion($cred);
        $service_token = $client->getAccessToken();
    }
    return $client;
}

$client = getGoogleClient();
$bq = new Google_Service_Bigquery($client);

/**
 * @see https://developers.google.com/bigquery/docs/reference/v2/jobs#resource
 */
$job = new Google_Service_Bigquery_Job();
$config = new Google_Service_Bigquery_JobConfiguration();
$config->setDryRun(false);
$queryConfig = new Google_Service_Bigquery_JobConfigurationQuery();
$config->setQuery($queryConfig);

$job->setConfiguration($config);

$destinationTable = new Google_Service_Bigquery_TableReference();
$destinationTable->setDatasetId(DATASET_ID);
$destinationTable->setProjectId(PROJECT_ID);
$destinationTable->setTableId('table1');

$queryConfig->setDestinationTable($destinationTable);

$sql = "select * from publicdata:samples.github_timeline limit 10";
$queryConfig->setQuery($sql);

try {
//    print_r($job);
//    exit;
    $job = $bq->jobs->insert(PROJECT_ID, $job);

    $status = new Google_Service_Bigquery_JobStatus();
    $status = $job->getStatus();
//    print_r($status);
    if ($status->count() != 0) {
        $err_res = $status->getErrorResult();
        die($err_res->getMessage());
    }
} catch (Google_Service_Exception $e) {
    echo $e->getMessage();
    exit;
}
//print_r($job);
$jr = $job->getJobReference();
//var_dump($jr);
$jobId = $jr['jobId'];
if ($status)
    $state = $status['state'];

echo 'JOBID:' . $jobId . " ";
echo 'STATUS:' . $state;
您可以通过以下方式获取结果:

$res = $bq->jobs->getQueryResults(PROJECT_ID, $_GET['jobId'], array('timeoutMs' => 1000));

if (!$res->jobComplete) {
    echo "Job not yet complete";
    exit;
}
echo "<p>Total rows: " . $res->totalRows . "</p>\r\n";
//see the results made it as an object ok
//print_r($res);
$rows = $res->getRows();
$r = new Google_Service_Bigquery_TableRow();
$a = array();
foreach ($rows as $r) {
    $r = $r->getF();
    $temp = array();
    foreach ($r as $v) {
        $temp[] = $v->v;
    }
    $a[] = $temp;
}
print_r($a);
$res=$bq->jobs->getQueryResults(项目ID,$\u GET['jobId',数组('timeoutMs'=>1000));
如果(!$res->jobComplete){
回应“作业尚未完成”;
出口
}
echo“总行数:”$res->totalRows。“

\r\n”; //查看将其作为对象生成的结果ok //印刷品(港币);; $rows=$res->getRows(); $r=新的Google_服务_Bigquery_TableRow(); $a=数组(); foreach($r行){ $r=$r->getF(); $temp=array(); 外汇($r为$v){ $temp[]=$v->v; } $a[]=$temp; } 印刷费($a);
您可以在这里看到可用于其他BigQuery调用的类。当您阅读该文件时,请知道该文件是从其他来源生成的,因此对于PHP来说它看起来很奇怪,您需要学习如何阅读它,以便能够使用其中的方法

比如:

  • Google\u服务\u Bigquery\u表格行
还可以查看标有[php]和[google bigquery]的问题
所有对BigQuery API的请求都必须经过身份验证。您可以使用标准OAuth流作为普通用户帐户进行身份验证,也可以作为后台任务的服务帐户进行身份验证(请参阅奔腾10的答案)。

您需要在google console api页面上创建一个服务帐户,请参阅我的答案以获取示例。