Я использую (Windows) IIS с PHP 8.1, grpc + натрия. У меня есть файл учетных данных из Google Firebase, и я просто читаю из коллекции под названием «информация».
На той же машине я использую IIS и Apache, тот же код отлично работает в Apache (Laragon), но не в IIS. IIS возвращает эту ошибку:
{ "ошибка": "{\n "сообщение": "пустой список адресов: ",\n "код": 14,\n "статус": "НЕДОСТУПНО",\n "подробности": []\n}" }
Я пробовал PHP8.1, 8.2 и 8.3 с той же ошибкой.
Я создал тестовую функцию, чтобы помочь, это функция, которую я запускаю.
public function testFirestore()
{
$credentialsPath = base_path(env('FIREBASE_CREDENTIALS'));
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $credentialsPath);
putenv('GRPC_VERBOSITY=DEBUG');
putenv('GRPC_TRACE=all');
try {
// Log the credentials path and environment variable
Log::info('GOOGLE_APPLICATION_CREDENTIALS: ' . getenv('GOOGLE_APPLICATION_CREDENTIALS'));
Log::info('Service account file exists: ' . (file_exists($credentialsPath) ? 'yes' : 'no'));
Log::info('GRPC_VERBOSITY: ' . getenv('GRPC_VERBOSITY'));
Log::info('GRPC_TRACE: ' . getenv('GRPC_TRACE'));
$firestore = new FirestoreClient([
'projectId' => '[projectid]',
]);
$collection = $firestore->collection('info');
$documents = $collection->documents();
$result = [];
foreach ($documents as $document) {
$result[] = [
'id' => $document->id(),
'data' => $document->data()
];
}
return response()->json($result);
} catch (\Exception $e) {
Log::error('Firestore error: ' . $e->getMessage());
return response()->json(['error' => $e->getMessage()], 500);
}
}
Буду рад отправить мой php.ini, если это поможет....
Ошибка, с которой вы сталкиваетесь, указывает на то, что клиент gRPC в PHP не может разрешить адрес сервера или подключиться к нему. Эта проблема может возникнуть по нескольким причинам. Я предлагаю вам включить подробное ведение журнала для gRPC и PHP в IIS, чтобы получить больше информация.
Я включил ведение журнала (там много данных...)) chand=000002A326287A70 lb_call=000002A326076000: добавление ожидающего пакета с индексом 0 chand=000002A326287A70 lb_call=000002A326076000: захват мьютекса LB для получения I 1725544810.338000000 chand=000002A326287A70 lb_call =000002A326076000: выполнение выбора с помощью средства выбора =000002A326197CF0 I1725544810.339000000 chand=000002A326287A70 lb_call=000002A326076000: Ошибка выбора LB: НЕДОСТУПНО: пустой список адресов: я не уверен, куда посмотрим дальше... любая помощь будет оценена по достоинству.






Оказывается, сертификат pem был неправильным.
Загрузите сертификат отсюда...
https://github.com/grpc/grpc/blob/master/etc/roots.pem
Добавьте переменную env с ключом «GRPC_DEFAULT_SSL_ROOTS_FILE_PATH» и значением пути, в котором вы сохранили загрузку. «C:\dev\certs\roots.pem». Затем перезагрузитесь.
Я не PHP-разработчик. Уточняющий вопрос | утверждение: учетные данные Firebase (!) не являются учетными данными приложения Google по умолчанию. Firebase — это не Firestore. Это не объясняет ошибку, поскольку я ожидал бы ошибку без аутентификации, но если ваши учетные данные Firebase включают ключи API Firebase, домен аутентификации и т. д., то их нельзя использовать для аутентификации в клиенте Firestore. FirestoreClient не должен нуждаться в каких-либо параметрах, поскольку это можно определить из учетных данных.