Я получаю следующую фатальную ошибку при запуске сценария php ниже:
Ожидание завершения работы
**Fatal error: Uncaught Error: Call to undefined method
Google\Cloud\BigQuery\CopyJobConfiguration::*reload()*
in /opt/bitnami/apache2/htdocs/test.php:53 Stack trace: #0 [internal function]:
{closure}() #1 /opt/bitnami/apache2/htdocs/vendor/google/cloud/src/Core/ExponentialBackoff.php(74):
call_user_func_array(Object(Closure), Array) #2 /opt/bitnami/apache2/htdocs/test.php(58):
Google\Cloud\Core\ExponentialBackoff->execute(Object(Closure)) #3 /opt/bitnami/apache2/htdocs/test.php(36):
copy_table('aaaa', 'bbbb', 'cccc', 'dddd', 'eeee') #4 {main} thrown in /opt/bitnami/apache2/htdocs/test.php on line 54**
.
<?php
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Pragma: no-cache"); // HTTP/1.0
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
# Includes the autoloader for libraries installed with composer
require "vendor/autoload.php";
use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\ServiceBuilder;
use Google\Cloud\Core\ExponentialBackoff;
$client = new Google_Client();
putenv('GOOGLE_APPLICATION_CREDENTIALS='.dirname(__FILE__) . '/.ssh/xxx.json');
$client->useApplicationDefaultCredentials();
# Your Google Cloud Platform project stuff
$projectId = 'aaaa';
$datasetIdin = 'bbbb';
$datasetIdout = 'cccc';
$tableIdin = "dddd";
$tableIdout = "eeee";
$gcloud = new ServiceBuilder([
'projectId' => $projectId
]);
copy_table($projectId, $datasetIdin, $datasetIdout, $tableIdin, $tableIdout);
function copy_table($projectId, $datasetIdin, $datasetIdout, $tableIdin, $tableIdout)
{
$bigQuery = new BigQueryClient([
'projectId' => $projectId,
]);
$datasetin = $bigQuery->dataset($datasetIdin);
$datasetout = $bigQuery->dataset($datasetIdout);
$sourceTable = $datasetin->table($tableIdin);
$destinationTable = $datasetout->table($tableIdout);
$job = $sourceTable->copy($destinationTable);
// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
print('Waiting for job to complete' . PHP_EOL);
$job->reload();
if (!$job->isComplete()) {
throw new Exception('Job has not yet completed', 500);
}
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
$error = $job->info()['status']['errorResult']['message'];
printf('Error running job: %s' . PHP_EOL, $error);
} else {
print('Table copied successfully' . PHP_EOL);
}
echo "table copied";
}
?>
Похоже, «хотя соответствующий класс не был загружен? Я использую composer.json:
{
"require": {
"google/cloud": "^0.47.0",
"google/apiclient": "^2.0"}
}
Есть идеи, почему я попадаю в эту ошибку? Спасибо!
Что-то не так в вашем подходе.
$job = $sourceTable->copy($destinationTable);
это не возвращает работу.
Возвращает копию конфигурация работы быть переданным либо Google\Cloud\BigQuery\Table::runJob()
или же Google\Cloud\BigQuery\Table::startJob()
,
поэтому вам необходимо добавить код для передачи этой функции вышеупомянутым функциям.
Других решений пока нет …