如何解決PHP中Avro序列化和反序列化的問題?使用mateusjunges/avro-serde-php可以!

最近,我在開發一個涉及大數據處理的 php 項目時,遇到了一個棘手的問題:如何高效地在 PHP 中進行 Avro 格式的數據序列化和反序列化。特別是在使用 Confluent Platform 時,如何確保數據在不同服務間的兼容性成為了一個挑戰。為了解決這個問題,我嘗試了多種方法,最終發現了 mateusjunges/avro-serde-php 這個庫,它徹底解決了我的困擾。

可以通過一下地址學習composer學習地址

mateusjunges/avro-serde-php 是一個專門為 PHP 設計的 Avro 序列化和反序列化庫,它與 Confluent Schema Registry 完美集成,確保了數據的兼容性和高效處理。使用 composer 安裝這個庫非常簡單:

composer require 'mateusjunges/avro-serde-php:^1.6'

首先,我們需要創建一個緩存的 Schema Registry 客戶端,以避免每次序列化或反序列化時都進行 http 請求:

use FlixTechSchemaRegistryApiRegistryCacheAvroObjectCacheAdapter; use FlixTechSchemaRegistryApiRegistryCachedRegistry; use FlixTechSchemaRegistryApiRegistryPromisingRegistry; use GuzzleHttpClient;  $schemaRegistryClient = new CachedRegistry(     new PromisingRegistry(         new Client(['base_uri' => 'registry.example.com'])     ),     new AvroObjectCacheAdapter() );

接下來,我們構建一個 RecordSerializer 實例,它是與這個庫交互的主要方式:

use FlixTechAvroSerializerObjectsRecordSerializer;  $recordSerializer = new RecordSerializer(     $schemaRegistry,     [         RecordSerializer::OPTION_REGISTER_MISSING_SCHEMAS => false,         RecordSerializer::OPTION_REGISTER_MISSING_SUBJECTS => false,     ] );

使用 RecordSerializer 進行編碼非常簡單:

立即學習PHP免費學習筆記(深入)”;

$subject = 'my-topic-value'; $avroSchema = AvroSchema::parse('{"type": "string"}'); $record = 'Test message';  $encodedBinaryAvro = $recordSerializer->encodeRecord($subject, $avroSchema, $record);

同樣,解碼消息也非常方便:

$record = $recordSerializer->decodeMessage($encodedBinaryAvro);  echo $record; // 'Test message'

此外,mateusjunges/avro-serde-php 還提供了多種 Schema Resolver 來管理 Avro 模式。例如,FileResolver 可以從文件中加載模式,而 CallableResolver 則提供了更高的靈活性。此外,還可以使用 ChainResolver 來組合多個解析器,以滿足不同需求。

對于 symfony 用戶,這個庫還提供了與 Symfony Serializer 組件的集成,使得在 Symfony 項目中使用 Avro 序列化變得更加簡單:

use FlixTechAvroSerializerIntegrationsSymfonySerializerAvroSerDeEncoder; use FlixTechAvroSerializerObjectsDefaultRecordSerializerFactory; use SymfonyComponentSerializerNormalizerGetSetMethodNormalizer; use SymfonyComponentSerializerSerializer;  $recordSerializer = DefaultRecordSerializerFactory::get(     getenv('SCHEMA_REGISTRY_HOST') );  $normalizer = new GetSetMethodNormalizer(); $encoder = new AvroSerDeEncoder($recordSerializer);  $symfonySerializer = new Serializer([$normalizer], [$encoder]);

最后,這個庫還提供了 Schema Builder 和 Schema Generator 功能,使得在 PHP 中定義和生成 Avro 模式變得更加直觀和高效。

使用 mateusjunges/avro-serde-php 庫,我不僅解決了 Avro 序列化和反序列化的難題,還極大地提升了項目的開發效率和數據處理的兼容性。如果你也在 PHP 項目中面臨類似的挑戰,不妨嘗試一下這個庫。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享