Ваш вопрос будет лучше объяснен более подробно.
Как бы то ни было, код, который вы показываете, совпадает с кодом, опубликованным Google.
Предполагается, что (!?) Код Google работает (возможно, но не обязательно), ваш код должен работать.
Поскольку мы знаем, что ваш код не работает, вероятно, это что-то еще.
Я подозреваю, что вы пропустили один или несколько следующие, возможно, последние шаги:
- создал проект Google Cloud Platform (
$projectId
)? - включил Pub / Sub API?
- создал Pub / Sub topi c [и> = 1 подписчик] (
$topicName
)? - созданный (служебный аккаунт) учетные данные, разрешенные для публикации sh на этом topi c?
- установить
GOOGLE_APPLICATION_CREDENTIALS
, чтобы указать на ключ учетной записи?
Как вы запускаете код?
Если возможно, пожалуйста, также print
ClientException
, который вы показываете на изображении.
Обновление
Я протестировал код Google, и он у меня работает:
BILLING_ID=[[YOUR-BILLING]]
PROJECT_ID=[[YOUR-PROJECT]]
TOPIC_NAME=[[YOUR-TOPIC-NAME]]
gcloud projects create ${PROJECT}
gcloud beta billing projects link ${PROJECT} \
--billing-account=${BILLING}
# Enabled Pub/Sub and create topic=subscription=${TOPIC_NAME}
gcloud services enable pubsub.googleapis.com \
--project=${PROJECT}
gcloud pubsub topics create ${TOPIC_NAME} \
--project=${PROJECT}
gcloud pubsub subscriptions create ${TOPIC_NAME} \
--topic=${TOPIC_NAME} \
--project=${PROJECT}
# Create service account ${ROBOT} and key `./${ROBOT}.json`
# Grant the account `publisher` permissions
ROBOT=[[YOUR-ACCOUNT-NAME]]
gcloud iam service-accounts create ${ROBOT} \
--project=${PROJECT}
gcloud iam service-accounts keys create ./${ROBOT}.json \
--iam-account=${ROBOT}@${PROJECT}.iam.gserviceaccount.com \
--project=${PROJECT}
gcloud projects add-iam-policy-binding ${PROJECT} \
--member=serviceAccount:${ROBOT}@${PROJECT}.iam.gserviceaccount.com \
--role=roles/pubsub.publisher
Затем - и извинения, я не * 1 067 * разработчик - вот что я сделал:
composer.json
:
{ "require": { "google/cloud-pubsub": "1.24.1" } }
pubsub.php
:
<?php
require_once 'vendor/autoload.php';
use Google\Cloud\PubSub\PubSubClient;
// Expects Env PROJECT_ID, TOPIC_NAME **and** GOOGLE_APPLICATION_CREDENTIALS
$projectId = getenv("PROJECT_ID");
$topicName = getenv("TOPIC_NAME");
$pubsub = new PubSubClient([
"projectId" => $projectId
]);
$topic = $pubsub->topic($topicName);
$topic->publish(["data"=>"Hello Freddie!"]);
print("Message published" . PHP_EOL);
?>
Тогда:
export GOOGLE_APPLICATION_CREDENTIALS=./${ROBOT}.json
export PROJECT_ID
export TOPIC_NAME
php pubsub.php
ПРИМЕЧАНИЕ код неявно предполагает GOOGLE_APPLICATION_CREDENTIALS
для аутентификации с помощью службы, см. Учетные данные приложения по умолчанию
дает:
Message published
И:
gcloud pubsub subscriptions pull ${TOPIC_NAME} \
--project=${PROJECT} \
--format="value(message.data)"
Hello Freddie!