У меня были проблемы с настройкой Kafka и Redis вместе в Laravel.
Я могу запустить Redis для использования базы данных в памяти. Так что Redis работает отлично.
$redis = app()->make('redis');
return $redis->get('name1'); // it runs fine returning value of "name1"
Я могу настроить Kafka в моей системе Windows, где я могу создавать и потреблять сообщения в терминалах.
Успешно настроил Rdkafka как клиентскую библиотеку php и расширения.
Пакет, который я использую в Laravel для Kafka, это "superbalist/laravel-pubsub": "^3.0", "superbalist/php-pubsub-kafka": "^2.0"
ССЫЛКА НА САЙТ
Приведенный ниже код предназначен для подписки и использования сообщения
$pubsub = app('pubsub');
$pubsub->subscribe('test1', function ($message) {
var_dump($message); // the code just stuck here
});
Браузер просто продолжает загружаться и не останавливается. Я пытался изучить код вендоров, но ответ не понятен.
Мой ENV в соответствии с запросом пакета
REDIS_HOST=localhost
REDIS_PASSWORD=null
REDIS_PORT=6379
PUBSUB_CONNECTION=redis
KAFKA_BROKERS=localhost
GOOGLE_CLOUD_PROJECT_ID=your-project-id-here
GOOGLE_CLOUD_KEY_FILE=path/to/your/gcloud-key.json
HTTP_PUBSUB_URI=null
HTTP_PUBSUB_SUBSCRIBE_CONNECTION=redis
Если локальный сервер и клиентские терминалы Redis закрыты, я получаю сообщение об ошибке
Ошибка при чтении строки с сервера [tcp: // localhost: 9092]
Пожалуйста, дайте мне знать, если кто-то смог настроить их оба в laravel.
вызов метода subscribe () является блокирующим, что означает, что скрипт никогда не завершится, поэтому причина, по которой ваш браузер никогда не прекращает загрузку.
Скрипт PHP, где у вас есть вызов метода subscribe (), должен запускаться из CLI, а не из браузера, потому что этот код потребляет сообщения Kafka и должен быть всегда живым. Если вы хотите публиковать сообщения в Kafka, вам нужно использовать метод publish ().
Из документации:
// consume messages
// note: this is a blocking call
$adapter->subscribe('my_channel', function ($message) {
var_dump($message);
});
// publish messages
$adapter->publish('my_channel', 'HELLO WORLD');
$adapter->publish('my_channel', ['hello' => 'world']);
$adapter->publish('my_channel', 1);
$adapter->publish('my_channel', false);
Других решений пока нет …