├── Makefile ├── .gitignore ├── stubs ├── RdKafka │ ├── Exception.php │ ├── Topic.php │ ├── Queue.php │ ├── KafkaConsumerTopic.php │ ├── Metadata │ │ ├── Broker.php │ │ ├── Topic.php │ │ ├── Partition.php │ │ └── Collection.php │ ├── Consumer.php │ ├── TopicConf.php │ ├── Metadata.php │ ├── Message.php │ ├── ProducerTopic.php │ ├── KafkaErrorException.php │ ├── TopicPartition.php │ ├── Producer.php │ ├── ConsumerTopic.php │ ├── Conf.php │ └── KafkaConsumer.php ├── functions.php ├── RdKafka.php └── constants.php ├── tests ├── RdKafkaTest.php ├── RdKafka │ ├── ExceptionTest.php │ ├── TopicTest.php │ ├── KafkaErrorExceptionTest.php │ ├── TopicConfTest.php │ ├── QueueTest.php │ ├── ProducerTopicTest.php │ ├── MetadataTest.php │ ├── ConsumerTopicTest.php │ ├── MessageTest.php │ ├── ConsumerTest.php │ ├── ConfTest.php │ └── ProducerTest.php ├── FunctionsTest.php └── ConstantsTest.php ├── composer.json ├── phpunit.xml ├── .travis.yml ├── README.md └── LICENSE /Makefile: -------------------------------------------------------------------------------- 1 | test: 2 | mkdir -p build 3 | vendor/bin/phpunit 4 | 5 | build: test 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /composer.lock 3 | /build/ 4 | /kafka_2.11-0.9.0.1/ 5 | *.cache 6 | -------------------------------------------------------------------------------- /stubs/RdKafka/Exception.php: -------------------------------------------------------------------------------- 1 | assertTrue($reflector->isAbstract()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /stubs/RdKafka/Queue.php: -------------------------------------------------------------------------------- 1 | assertTrue($reflector->isAbstract()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kwn/php-rdkafka-stubs", 3 | "description": "Rdkafka extension stubs for your IDE", 4 | "license": "MIT", 5 | "authors": [ 6 | { 7 | "name": "Karol Wnuk", 8 | "email": "k.wnuk@ascetic.pl" 9 | } 10 | ], 11 | "require": { 12 | "ext-rdkafka": ">=6.0" 13 | }, 14 | "require-dev": { 15 | "phpunit/phpunit": "^8.2.4" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | tests/ 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /stubs/RdKafka/Metadata/Broker.php: -------------------------------------------------------------------------------- 1 | assertTrue(function_exists('rd_kafka_err2str')); 10 | } 11 | 12 | public function testErrno2Err() 13 | { 14 | $this->assertTrue(function_exists('rd_kafka_errno2err')); 15 | } 16 | 17 | public function testErrno() 18 | { 19 | $this->assertTrue(function_exists('rd_kafka_errno')); 20 | } 21 | 22 | public function testOffsetTail() 23 | { 24 | $this->assertTrue(function_exists('rd_kafka_offset_tail')); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /stubs/RdKafka/Metadata/Partition.php: -------------------------------------------------------------------------------- 1 | kafka_2.11-2.3.0/kafka.log 2>&1 & 26 | - sleep 10 27 | 28 | script: 29 | - make build 30 | -------------------------------------------------------------------------------- /tests/RdKafka/KafkaErrorExceptionTest.php: -------------------------------------------------------------------------------- 1 | getErrorString()); 18 | self::assertTrue($e->isFatal()); 19 | self::assertFalse($e->isRetriable()); 20 | self::assertTrue($e->transactionRequiresAbort()); 21 | 22 | throw $e; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /stubs/RdKafka/Metadata/Collection.php: -------------------------------------------------------------------------------- 1 | 6. For older verisions of rdkafka extenstion (3.x and 0.9) please use version 1.x of this repository. 7 | 8 | ## Installation 9 | 10 | Add package to your composer.json dev dependencies 11 | 12 | ``` 13 | $ composer require kwn/php-rdkafka-stubs --dev 14 | ``` 15 | 16 | ## Usage 17 | 18 | Once package is installed, your IDE should simply discover all stubs automatically. Please notice, that `kwn/php-rdkafka-stubs` 19 | package has no autoloader configuration provided, so stubs classes are visible in your IDE, but don't clashes with `rdkafka` 20 | extension namespaces. 21 | -------------------------------------------------------------------------------- /tests/RdKafka/TopicConfTest.php: -------------------------------------------------------------------------------- 1 | topicConf = new TopicConf(); 17 | } 18 | 19 | public function testDump() 20 | { 21 | $this->markTestSkipped('Fails on CI'); 22 | 23 | $expectedKeys = [ 24 | 'request.required.acks', 25 | 'enforce.isr.cnt', 26 | 'request.timeout.ms', 27 | 'message.timeout.ms', 28 | 'produce.offset.report', 29 | 'auto.commit.enable', 30 | 'auto.commit.interval.ms', 31 | 'auto.offset.reset', 32 | 'offset.store.path', 33 | 'offset.store.sync.interval.ms', 34 | 'offset.store.method' 35 | ]; 36 | 37 | $dumpedKeys = array_keys($this->topicConf->dump()); 38 | 39 | $this->assertEquals($expectedKeys, $dumpedKeys); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /stubs/RdKafka/ProducerTopic.php: -------------------------------------------------------------------------------- 1 | set('metadata.broker.list', 'localhost:9092'); 25 | $consumer = new Consumer($conf); 26 | 27 | $this->consumerTopic = $consumer->newTopic('test'); 28 | $this->queue = $consumer->newQueue(); 29 | } 30 | 31 | public function testConsumeViaQueue() 32 | { 33 | $this->markTestSkipped('Consuming via queue does not work'); 34 | 35 | $this->consumerTopic->consumeQueueStart(self::PARTITION, RD_KAFKA_OFFSET_BEGINNING, $this->queue); 36 | $this->consumerTopic->consume(self::PARTITION, 100); 37 | $this->consumerTopic->consumeStop(self::PARTITION); 38 | 39 | $message = $this->queue->consume(200); 40 | 41 | $this->assertInstanceOf(Message::class, $message); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /stubs/RdKafka/TopicPartition.php: -------------------------------------------------------------------------------- 1 | set('metadata.broker.list', 'localhost:9092'); 18 | $producer = new Producer($conf); 19 | 20 | $this->producerTopic = $producer->newTopic('test'); 21 | } 22 | 23 | public function testProducerTopicCantBeInstantiatedDirectly() 24 | { 25 | $reflector = new \ReflectionClass(ProducerTopic::class); 26 | $constructor = $reflector->getConstructor(); 27 | 28 | $this->assertTrue($constructor->isPrivate()); 29 | } 30 | 31 | public function testGetName() 32 | { 33 | $topicName = $this->producerTopic->getName(); 34 | 35 | $this->assertEquals('test', $topicName); 36 | } 37 | 38 | public function testProduce() 39 | { 40 | $this->producerTopic->produce(RD_KAFKA_PARTITION_UA, 0, 'testing kafka messages', 'test_key'); 41 | 42 | $this->markTestIncomplete('Add consumer to test if message has been sent'); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /stubs/RdKafka/Producer.php: -------------------------------------------------------------------------------- 1 | set('metadata.broker.list', 'localhost:9092'); 19 | $producer = new Producer($conf); 20 | 21 | sleep(1); 22 | 23 | if (method_exists($producer, 'getMetadata')) { 24 | $this->metadata = $producer->getMetadata(true, null, 1000); 25 | } else { 26 | $this->metadata = $producer->metadata(true, null, 1000); 27 | } 28 | } 29 | 30 | public function testGetBrokers() 31 | { 32 | $this->assertInstanceOf(Collection::class, $this->metadata->getBrokers()); 33 | } 34 | 35 | public function testGetTopics() 36 | { 37 | $this->assertInstanceOf(Collection::class, $this->metadata->getTopics()); 38 | } 39 | 40 | public function testGetOrigBrokerId() 41 | { 42 | $this->assertEquals(0, $this->metadata->getOrigBrokerId()); 43 | } 44 | 45 | public function testGetOrigBrokerName() 46 | { 47 | $this->assertEquals('localhost:9092/0', $this->metadata->getOrigBrokerName()); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /tests/RdKafka/ConsumerTopicTest.php: -------------------------------------------------------------------------------- 1 | set('metadata.broker.list', 'localhost:9092'); 20 | $consumer = new Consumer(); 21 | 22 | $this->consumerTopic = $consumer->newTopic('test'); 23 | } 24 | 25 | public function testConsumerTopicCantBeInstantiatedDirectly() 26 | { 27 | $reflector = new \ReflectionClass(ConsumerTopic::class); 28 | $constructor = $reflector->getConstructor(); 29 | 30 | $this->assertTrue($constructor->isPrivate()); 31 | } 32 | 33 | public function testGetName() 34 | { 35 | $topicName = $this->consumerTopic->getName(); 36 | 37 | $this->assertEquals('test', $topicName); 38 | } 39 | 40 | public function testConsume() 41 | { 42 | $this->markTestSkipped('Fails on CI'); 43 | 44 | $conf = new Conf(); 45 | $conf->set('metadata.broker.list', 'localhost:9092'); 46 | $producer = new Producer($conf); 47 | 48 | /** @var ProducerTopic $producerTopic */ 49 | $producerTopic = $producer->newTopic('test'); 50 | $producerTopic->produce(self::PARTITION, 0, 'test message'); 51 | 52 | $this->consumerTopic->consumeStart(self::PARTITION, RD_KAFKA_OFFSET_BEGINNING); 53 | 54 | $message = $this->consumerTopic->consume(self::PARTITION, 1000); 55 | 56 | $this->consumerTopic->consumeStop(self::PARTITION); 57 | 58 | $this->assertInstanceOf(Message::class, $message); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /tests/RdKafka/MessageTest.php: -------------------------------------------------------------------------------- 1 | set('metadata.broker.list', 'localhost:9092'); 21 | 22 | $producer = new Producer($conf); 23 | 24 | /** @var ProducerTopic $producerTopic */ 25 | $producerTopic = $producer->newTopic('test'); 26 | $producerTopic->produce(RD_KAFKA_PARTITION_UA, self::PARTITION, 'test message 2', 'key_2'); 27 | 28 | $consumer = new Consumer($conf); 29 | 30 | /** @var ConsumerTopic $consumerTopic */ 31 | $consumerTopic = $consumer->newTopic('test'); 32 | $consumerTopic->consumeStart(self::PARTITION, RD_KAFKA_OFFSET_BEGINNING); 33 | 34 | $this->message = $consumerTopic->consume(self::PARTITION, 1000); 35 | 36 | //$consumerTopic->consumeStop(self::PARTITION); 37 | } 38 | 39 | public function testMessageProperties() 40 | { 41 | $this->markTestSkipped('Fails on CI'); 42 | 43 | $this->assertEquals(0, $this->message->err); 44 | $this->assertEquals('test', $this->message->topic_name); 45 | $this->assertEquals(self::PARTITION, $this->message->partition); 46 | $this->assertEquals('test message 2', $this->message->payload); 47 | $this->assertEquals('key_2', $this->message->key); 48 | $this->assertGreaterThanOrEqual(0, $this->message->offset); 49 | } 50 | 51 | public function testErrstr() 52 | { 53 | $this->markTestSkipped('Fails on CI'); 54 | 55 | $this->assertEquals('test message 2', $this->message->errstr()); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /stubs/RdKafka/ConsumerTopic.php: -------------------------------------------------------------------------------- 1 | set('metadata.broker.list', 'localhost:9092'); 19 | $this->consumer = new Consumer($conf); 20 | } 21 | 22 | public function testAddBrokers() 23 | { 24 | $addedBrokersNumber = $this->consumer->addBrokers('localhost:9092'); 25 | 26 | $this->assertEquals(1, $addedBrokersNumber); 27 | } 28 | 29 | public function testGetMetadata() 30 | { 31 | if (method_exists($this->consumer, 'getMetadata')) { 32 | $metadata = $this->consumer->getMetadata(true, null, 60e3); 33 | } else { 34 | $metadata = $this->consumer->metadata(true, null, 60e3); 35 | } 36 | 37 | $this->assertInstanceOf(Metadata::class, $metadata); 38 | } 39 | 40 | public function testGetOutQLen() 41 | { 42 | if (method_exists($this->consumer, 'getOutQLen')) { 43 | $outQLen = $this->consumer->getOutQLen(); 44 | } else { 45 | $outQLen = $this->consumer->outQLen(); 46 | } 47 | 48 | $this->assertEquals(0, $outQLen); 49 | } 50 | 51 | public function testNewQueue() 52 | { 53 | $queue = $this->consumer->newQueue(); 54 | 55 | $this->assertInstanceOf(Queue::class, $queue); 56 | } 57 | 58 | public function testNewTopic() 59 | { 60 | $topic = $this->consumer->newTopic('test'); 61 | 62 | $this->assertInstanceOf(ConsumerTopic::class, $topic); 63 | } 64 | 65 | public function testPoll() 66 | { 67 | $this->consumer->poll(0); 68 | 69 | $this->markTestIncomplete('Create real test and trigger a callback using poll()'); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /tests/RdKafka/ConfTest.php: -------------------------------------------------------------------------------- 1 | conf = new Conf(); 17 | } 18 | 19 | /** 20 | * dump() returns all values for parameters as strings 21 | */ 22 | public function testDump() 23 | { 24 | $this->markTestSkipped('Fails on CI'); 25 | 26 | $expectedKeys = [ 27 | 'client.id', 28 | 'message.max.bytes', 29 | 'receive.message.max.bytes', 30 | 'metadata.request.timeout.ms', 31 | 'topic.metadata.refresh.interval.ms', 32 | 'topic.metadata.refresh.fast.cnt', 33 | 'topic.metadata.refresh.fast.interval.ms', 34 | 'topic.metadata.refresh.sparse', 35 | 'socket.timeout.ms', 36 | 'socket.send.buffer.bytes', 37 | 'socket.receive.buffer.bytes', 38 | 'socket.keepalive.enable', 39 | 'socket.max.fails', 40 | 'broker.address.ttl', 41 | 'broker.address.family', 42 | 'statistics.interval.ms', 43 | 'log_cb', 44 | 'log_level', 45 | 'socket_cb', 46 | 'open_cb', 47 | 'internal.termination.signal', 48 | 'queued.min.messages', 49 | 'queued.max.messages.kbytes', 50 | 'fetch.wait.max.ms', 51 | 'fetch.message.max.bytes', 52 | 'fetch.min.bytes', 53 | 'fetch.error.backoff.ms', 54 | 'queue.buffering.max.messages', 55 | 'queue.buffering.max.ms', 56 | 'message.send.max.retries', 57 | 'retry.backoff.ms', 58 | 'compression.codec', 59 | 'batch.num.messages', 60 | 'delivery.report.only.error' 61 | ]; 62 | 63 | $dumpedKeys = array_keys($this->conf->dump()); 64 | 65 | $this->assertEquals($expectedKeys, $dumpedKeys); 66 | } 67 | 68 | public function testSet() 69 | { 70 | $this->conf->set('batch.num.messages', 666); 71 | 72 | $dumpedConfig = $this->conf->dump(); 73 | $batchNumMessages = $dumpedConfig['batch.num.messages']; 74 | 75 | $this->assertEquals(666, $batchNumMessages); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /stubs/RdKafka/Conf.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | public function dump(): array 14 | { 15 | } 16 | 17 | /** 18 | * @param string $name 19 | * @param string $value 20 | * 21 | * @return void 22 | */ 23 | public function set(string $name, string $value) 24 | { 25 | } 26 | 27 | /** 28 | * @param TopicConf $topic_conf 29 | * 30 | * @deprecated Set default topic settings normally like global configuration settings. 31 | * 32 | * @return void 33 | */ 34 | public function setDefaultTopicConf(TopicConf $topic_conf) 35 | { 36 | } 37 | 38 | /** 39 | * @param callable $callback (RdKafka\Kafka $kafka, RdKafka\Message $message) 40 | * 41 | * @return void 42 | */ 43 | public function setDrMsgCb(callable $callback) 44 | { 45 | } 46 | 47 | /** 48 | * @param callable $callback (RdKafka\KafkaConsumer|RdKafka\Producer $kafka, int $err, string $reason) 49 | * 50 | * @return void 51 | */ 52 | public function setErrorCb(callable $callback) 53 | { 54 | } 55 | 56 | /** 57 | * @param callable $callback (RdKafka\KafkaConsumer $kafka, int $err, array $partitions) 58 | * 59 | * @return void 60 | */ 61 | public function setRebalanceCb(callable $callback) 62 | { 63 | } 64 | 65 | /** 66 | * @param callable $callback (object $kafka, string $json, int $json_len); 67 | * 68 | * @return void 69 | */ 70 | public function setStatsCb(callable $callback) 71 | { 72 | } 73 | 74 | /** 75 | * @param callable $callback (RdKafka\Message $msg) 76 | * 77 | * @return void 78 | */ 79 | public function setConsumeCb(callable $callback) 80 | { 81 | } 82 | 83 | /** 84 | * @param callable $callback (object $kafka, int $err, array $partitions); 85 | * 86 | * @return void 87 | */ 88 | public function setOffsetCommitCb(callable $callback) 89 | { 90 | } 91 | 92 | /** 93 | * @param callable $callback (object $kafka, int $level, string $facility, string $message); 94 | * 95 | * @return void 96 | */ 97 | public function setLogCb(callable $callback) 98 | { 99 | } 100 | 101 | /** 102 | * @param callable $callback (RdKafka\Producer $producer) 103 | * 104 | * @return void 105 | */ 106 | public function setOauthbearerTokenRefreshCb(callable $callback) 107 | { 108 | 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /stubs/RdKafka.php: -------------------------------------------------------------------------------- 1 | assertCount( 35 | 0, 36 | $stubConstantsNotInExtension, 37 | sprintf( 38 | 'In stub but not in extension: %s', 39 | var_export($stubConstantsNotInExtension, true) 40 | ) 41 | ); 42 | } 43 | 44 | public function testConstantsExistInExtensionOnly() 45 | { 46 | // constants that present in extension but not in stub 47 | $extensionConstantsNotInStub = array_diff_key( 48 | self::$extensionConstants, 49 | self::$stubConstants 50 | ); 51 | 52 | $this->assertCount( 53 | 0, 54 | $extensionConstantsNotInStub, 55 | sprintf( 56 | 'In extension but not in stub: %s', 57 | var_export($extensionConstantsNotInStub, true) 58 | ) 59 | ); 60 | } 61 | 62 | public function testConstantsExistButInvalidValue() 63 | { 64 | $extensionConstants = self::$extensionConstants; 65 | $stubConstants = self::$stubConstants; 66 | 67 | // unset because depends of extension version 68 | unset($extensionConstants['RD_KAFKA_VERSION']); 69 | unset($extensionConstants['RD_KAFKA_BUILD_VERSION']); 70 | unset($stubConstants['RD_KAFKA_VERSION']); 71 | unset($stubConstants['RD_KAFKA_BUILD_VERSION']); 72 | 73 | // constants in both places but has different values 74 | $this->assertEquals( 75 | array_intersect_key( 76 | $extensionConstants, 77 | $stubConstants 78 | ), 79 | array_intersect_key( 80 | $stubConstants, 81 | $extensionConstants 82 | ) 83 | ); 84 | } 85 | 86 | private static function loadConstantsFromStub(): array 87 | { 88 | $stubConstants = []; 89 | $constantsStubFile = fopen(__DIR__ . '/../stubs/constants.php', 'r+'); 90 | while (!feof($constantsStubFile)) { 91 | $line = trim(fgets($constantsStubFile)); 92 | if (!preg_match('/const ([0-9A-Z_]+) = (.+);/', $line, $matches)) { 93 | continue; 94 | } 95 | 96 | $stubConstants[$matches[1]] = (int) $matches[2]; 97 | } 98 | 99 | return $stubConstants; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /tests/RdKafka/ProducerTest.php: -------------------------------------------------------------------------------- 1 | filename = __DIR__ . '/../../build/message.txt'; 25 | 26 | if (is_file($this->filename)) { 27 | unlink($this->filename); 28 | } 29 | 30 | $configuration = new Conf(); 31 | $configuration->set('metadata.broker.list', 'localhost:9092'); 32 | $configuration->setDrMsgCb(function (\RdKafka $kafka, Message $message) { 33 | file_put_contents($this->filename, $message->payload); 34 | }); 35 | 36 | $this->producer = new Producer($configuration); 37 | } 38 | 39 | public function testAddBrokers() 40 | { 41 | $addedBrokersNumber = $this->producer->addBrokers('localhost:9092'); 42 | 43 | self::assertEquals(1, $addedBrokersNumber); 44 | } 45 | 46 | public function testGetMetadata() 47 | { 48 | $metadata = $this->producer->getMetadata(true, null, 5000); 49 | 50 | self::assertInstanceOf(Metadata::class, $metadata); 51 | } 52 | 53 | public function testGetOutQLen() 54 | { 55 | $outQLen = $this->producer->getOutQLen(); 56 | 57 | self::assertEquals(0, $outQLen); 58 | } 59 | 60 | public function testNewTopic() 61 | { 62 | $topic = $this->producer->newTopic('test'); 63 | 64 | self::assertInstanceOf(ProducerTopic::class, $topic); 65 | } 66 | 67 | public function testPoll() 68 | { 69 | $topic = $this->producer->newTopic('test'); 70 | $topic->produce(RD_KAFKA_PARTITION_UA, 0, self::MESSAGE_PAYLOAD); 71 | 72 | $this->producer->poll(0); 73 | $this->producer->flush(10000); 74 | 75 | self::assertStringEqualsFile($this->filename, self::MESSAGE_PAYLOAD); 76 | } 77 | 78 | public function testInitTransactions() 79 | { 80 | $configuration = new Conf(); 81 | $configuration->set('metadata.broker.list', 'localhost:9092'); 82 | $configuration->set('transactional.id', 'some-id'); 83 | 84 | $this->producer = new Producer($configuration); 85 | 86 | self::assertNull($this->producer->initTransactions(10000)); 87 | } 88 | 89 | public function testBeginTransaction() 90 | { 91 | $configuration = new Conf(); 92 | $configuration->set('metadata.broker.list', 'localhost:9092'); 93 | $configuration->set('transactional.id', 'some-id'); 94 | 95 | $this->producer = new Producer($configuration); 96 | 97 | $this->producer->initTransactions(10000); 98 | self::assertNull($this->producer->beginTransaction()); 99 | } 100 | 101 | public function testCommitTransaction() 102 | { 103 | $configuration = new Conf(); 104 | $configuration->set('metadata.broker.list', 'localhost:9092'); 105 | $configuration->set('transactional.id', 'some-id'); 106 | 107 | $this->producer = new Producer($configuration); 108 | 109 | $this->producer->initTransactions(10000); 110 | $this->producer->beginTransaction(); 111 | self::assertNull($this->producer->commitTransaction(10000)); 112 | } 113 | 114 | public function testAbortTransaction() 115 | { 116 | $configuration = new Conf(); 117 | $configuration->set('metadata.broker.list', 'localhost:9092'); 118 | $configuration->set('transactional.id', 'some-id'); 119 | 120 | $this->producer = new Producer($configuration); 121 | 122 | $this->producer->initTransactions(10000); 123 | $this->producer->beginTransaction(); 124 | self::assertNull($this->producer->abortTransaction(10000)); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /stubs/RdKafka/KafkaConsumer.php: -------------------------------------------------------------------------------- 1 |