我一直在学习kafka和laravel。
所以我试图在laravel中实现kafka(使用rdkafka),但我遇到了问题
当我尝试在php中使用kafka时,一切都在纯php中正常工作,但是当我尝试在laravel中作为命令类实现它时出现错误
$conf = new RdKafka\Conf();
我认为这是问题, RdKafka是php.ini中的动态扩展(我直接从php.ini手动添加它)并且当我尝试在laravel中实现并且我不知道如何解决它时变得不确定。
如何在laravel中使用动态扩展?
这是rdkafka的命令类和消费者功能教程
namespace App\Console\Commands;
use Illuminate\Console\Command;
class ExampleCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'command:name';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
$conf = new RdKafka\Conf();
$conf->set('group.id', 'myConsumerGroup');
$rk = new RdKafka\Consumer($conf);
$rk->addBrokers("127.0.0.1");
$topicConf = new RdKafka\TopicConf();
$topicConf->set('auto.commit.interval.ms', 100);
$topicConf->set('offset.store.method', 'file');
$topicConf->set('offset.store.path', sys_get_temp_dir());
$topicConf->set('auto.offset.reset', 'smallest');
$topic = $rk->newTopic("test", $topicConf);
$topic->consumeStart(0, RD_KAFKA_OFFSET_STORED);
while (true) {
$message = $topic->consume(0, 120*10000);
switch ($message->err) {
case RD_KAFKA_RESP_ERR_NO_ERROR:
var_dump($message);
break;
case RD_KAFKA_RESP_ERR__PARTITION_EOF:
echo "No more messages; will wait for more\n";
break;
case RD_KAFKA_RESP_ERR__TIMED_OUT:
echo "Timed out\n";
break;
default:
throw new \Exception($message->errstr(), $message->err);
break;
}
}
}
}
我从artisan命令得到的错误
[Symfony\Component\Debug\Exception\FatalThrowableError]
Class 'App\Console\Commands\RdKafka\Conf' not found
答案 0 :(得分:0)
我正在使用PHPStorm并且IDE识别命名空间时遇到了同样的问题。我终于发现我需要安装IDE的存根来识别扩展名称空间。扩展实际上工作(\ RdKafka)。只是在安装存根之前IDE没有识别命名空间。