PHP
FlatBuffers

[PHP] PHPでFlatBuffer マスターデータ編

More than 1 year has passed since last update.


■概要

PHPのFlatBuffersでマスターデータを想定したデータを扱ったメモ。


■環境

CentOS 7.4

PHP 5.4.16

flatbuffers 1.8.0


■どんなデータを扱うか

テストとして以下のようなレコードのデータを扱う。

id
name
damage
sell

0
None
0
0

1
Sword
3
10

2
Axe
5
15

3
Arrow
1
5

4
Spear
3
8


■テストコード


シリアライズしたデータの書き込み

<?php

// flatbuffersファイル
require_once("php/ByteBuffer.php");
require_once("php/Constants.php");
require_once("php/FlatbufferBuilder.php");
require_once("php/Struct.php");
require_once("php/Table.php");

// スキーマファイルをコンパイルしたファイル
require_once("MasterData/Weapon.php");
require_once("MasterData/WeaponMaster.php");

// テスト用入力データ
$weaponList = array(
array('id' => 0, 'name' => "None", 'damage' => 0, 'sell' => 0),
array('id' => 1, 'name' => "Sword", 'damage' => 3, 'sell' => 10),
array('id' => 2, 'name' => "Axe", 'damage' => 5, 'sell' => 15),
array('id' => 3, 'name' => "Arrow", 'damage' => 1, 'sell' => 5),
array('id' => 4, 'name' => "Spear", 'damage' => 3, 'sell' => 8),
);

// バッファ生成
$builder = new Google\FlatBuffers\FlatBufferBuilder(1);

// マスターデータのレコードにパラメータを設定 ----------------

$recordsVector = array();

// 入力パラメータを登録
foreach ($weaponList as $dt)
{
// パラメータ取得
$weaponId = $dt['id'];
$weaponName = $builder->createString($dt['name']);
$weaponDamage = $dt['damage'];
$weaponSell = $dt['sell'];

// Weaponテーブル構築開始
MasterData\Weapon::startWeapon($builder);
// Weaponパラメータ設定
MasterData\Weapon::addId($builder, $weaponId);
MasterData\Weapon::addName($builder, $weaponName);
MasterData\Weapon::addDamage($builder, $weaponDamage);
MasterData\Weapon::addSell($builder, $weaponSell);
// Weapon構築終了
$weapon_offset = MasterData\Weapon::endWeapon($builder);

// weaponテーブルのオフセットをベクターに追加
$recordsVector[] = $weapon_offset;
}

// ルートにレコードのベクターを設定 --------------------------

// パラメータ取得
$recordsOffset = MasterData\WeaponMaster::createRecordsVector($builder, $recordsVector);

// 構築開始
MasterData\WeaponMaster::startWeaponMaster($builder);
// パラメータ設定
MasterData\WeaponMaster::addRecords($builder, $recordsOffset);
// 構築終了
$masterOffset = MasterData\WeaponMaster::endWeaponMaster($builder);

// バッファ構築終了
$builder->finish($masterOffset);

// バイナリファイル出力
file_put_contents("weapon_data.bin", $builder->sizedByteArray());


シリアライズデータを読み込んでデシリアライズ

<?php

// flatbuffersファイル
require_once("php/ByteBuffer.php");
require_once("php/Constants.php");
require_once("php/FlatbufferBuilder.php");
require_once("php/Struct.php");
require_once("php/Table.php");

// スキーマファイルをコンパイルしたファイル
require_once("MasterData/Weapon.php");
require_once("MasterData/WeaponMaster.php");

// バイナリファイル読み込み
$filename = "weapon_data.bin";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);

// 読み込んだ生データからByteBufferを生成
$byteBuffers = Google\FlatBuffers\ByteBuffer::wrap($contents);

// デシリアライズオブジェクトを取得
$weaponMaster = MasterData\WeaponMaster::getRootAsWeaponMaster($byteBuffers);

// デバッグ表示
for($i = 0; $i < $weaponMaster->getRecordsLength(); $i++)
{
$record = $weaponMaster->getRecords($i);
print_r("id:{$record->getId()}, name:{$record->getName()}, damage:{$record->getDamage()}, sell:{$record->getSell()}\n");
}


■参考

flatbuffers/samples/SampleBinary.php

FlatBuffersをPHPで使ってみる