PHP 拡張モジュールは、Erlang ext term 形式 (term_to_binary によって生成) でバイナリ データを解凍します
1.
記事「Erlang の Term_to_Binary データ パケット メカニズムの予備調査」では、Erlang 拡張用語形式 (Erlang 外部用語形式) バイナリ
の役割が紹介されています。
一部の学生は、term_to_binary 関数を使用して Erlang データをパッケージ化し、バイナリ形式でデータベースに保存し、PHP を使用して読み取って PHP 配列に解凍したいと考えています。
上記のアプリケーション シナリオで発生する問題を解決するには、
peb (Php-Erlang Bridge) 拡張機能を参照して、erlang:binary_to_term/1 関数に似たこのバイナリ拡張機能、
を作成しました。
これは、binary_to_term の PHP バージョンとして理解できます。
2. バイナリ拡張の概要
2.1. このバイナリ拡張機能は次の 3 つの関数をエクスポートします:
array binary_to_term(string $binary) は、アンパックされた配列を返します。 - int binary_errno () は、binary_to_term への最後の呼び出しによって生成されたエラー コードを返します。 0 はエラーがないことを意味し、1 はサポートされていないデータ型がバイナリ コンテンツに含まれていることを意味します。
- string binary_error () binary_to_term への最後の呼び出しによって生成されたエラー メッセージを返します。エラーがない場合は空を返します。
-
2.2. バイナリ拡張モジュールのダウンロード アドレス:
http://download.csdn.net/download/u011471961/6447631
3. バイナリ拡張機能のインストール
*nux にインストール:
ステップ 1:
----------
binary.zip を解凍します
cd ./バイナリ
phpize または phpize5
ステップ 2:
----------
configureを実行する前に、Erlangのインストールディレクトリとphp-configのパスを確認してください。以下のconfigureは一例であり、実際のパスに応じて変更できます。
Linux にインストールします:
./configure CC="gcc -L/usr/local/lib/erlang/lib/erl_interface-3.7.11/lib -I/usr/local/lib/erlang/lib/erl_interface-3.7.11/include" -- Enable-binary --with-php-config=/usr/local/php/bin/php-config
または:
./configure CC="gcc -L/usr/local/lib/erlang/lib/erl_interface-3.7.11/lib -I/usr/local/lib/erlang/lib/erl_interface-3.7.11/include" -- Enable-binary --with-php-config=/usr/bin/php-config5
Apple コンピュータにインストールします:
sudo MACOSX_DEPLOYMENT_TARGET=10.7 CFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp" CCFLAGS="-arch i386 -arch x86_64 -g -Os -pipe" CXXFLAGS="-arch i386 -arch x86_64 -g -Os -pipe" LDFLAGS="-arch i386 -arch x86_64 -bind_at_load" ./configure CC="gcc
-m32 -L/usr/local/lib/erlang/lib/erl_interface-3.7.6/lib -I/usr/local/lib/erlang/lib/erl_interface-3.7.6/include" --enable-binary
ステップ 3:
----------
作る
ステップ 4:
----------
テストを作成します
ステップ 5:
----------
インストールを行う
ステップ 6:
----------
php.ini ファイルを変更します:
拡張子=binary.so
または:
拡張子=/path/to/binary.so
ステップ 7:
----------
php-cgi または apache
を再起動します。
ステップ 8:
----------
phpinfo() 関数またはコマンド (php -m) を通じてバイナリ モジュールがロードされているかどうかを確認します。
4. バイナリ拡張の適用例
4.1. mysql データテーブルを作成する
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bin` varbinary(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
4.2. Erlang 側でのデータの書き込み
test() ->
Data = [{name, rolong},{phone, 888888}],
Bin = term_to_binary(Data),
%% 写入数据库的接口依自己情况而定
db:execute(<<"insert test(bin) values(~s);">>, [Bin]).
4.3. PHP で PHP 配列を読み取り、解凍します
<?php
$sql = "select `bin` from test order by id desc limit 1";
%% 读取数据库的接口依自己情况而定
$bin = Db::getInstance()->getOne($sql);
$data = binary_to_term($bin);
echo '<pre class="brush:php;toolbar:false">';
var_dump($data);
echo '
';
出力
array(1) {
[0]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(4) "name"
[1]=>
string(6) "rolong"
}
[1]=>
array(2) {
[0]=>
string(5) "phone"
[1]=>
int(888888)
}
}
}
4. 概要
バイナリ拡張モジュールでは、あまり一般的に使用されない一部のデータ型は当面サポートされていません。特別なニーズがある学生は、それらを変更してソース コードに実装できます。
Erlang は、データのパケット化とアンパックのための C インターフェイスを提供します。を参照してください。
http://www.erlang.org/doc/apps/erl_interface/index.html