当前位置:编程学习 > php >>

PHP扩展模块解包(由term_to_binary生成的)Erlang ext term格式的二进制数据

1、引言
《初探Erlang的term_to_binary数据封包机制》一文中已经介绍了Erlang扩展term格式(Erlang external term format)binary的作用,
有些同学想把Erlang数据通过term_to_binary函数封包后以二制进形式存入数据库,然后用PHP读取并解包成PHP数组。
为了解决上面的这种应用场合中遇到的问题,
参考peb(Php-Erlang Bridge)扩展写了这个类似erlang:binary_to_term/1函数功能的binary扩展,
可以理解为是PHP版的binary_to_term。
 
2、binary扩展简介
 
2.1、这个binary扩展导出了以下三个函数:
array binary_to_term(string $binary) 返回解包后的数组。
int binary_errno () 返回上次调用binary_to_term产生的错误代号。0为无错语,1为二进制内容中出现在不支持的数据类型。
string binary_error () 返回上次调用binary_to_term产生的错误信息,如果没有出错则为空。
2.2、binary扩展模块下载地址:
http://download.csdn.net/download/u011471961/6447631
 
3、binary扩展的安装
 
Install On *nux:
 
Step 1:
---------
unzip binary.zip
cd ./binary
phpize或phpize5
 
 
Step 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
OR:
./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
在苹果电脑上安装:
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
 
 
Step 3:
---------
make
 
 
Step 4:
---------
make test
 
 
Step 5:
---------
make install
 
 
Step 6:
---------
修改php.ini文件:
extension=binary.so
OR:
extension=/path/to/binary.so
 
 
Step 7:
---------
重启php-cgi或apache
 
 
Step 8:
---------
通过phpinfo()函数或命令(php -m)查看是否加载了binary模块。
 
 
4、binary扩展应用示例
 
4.1、创建mysql数据表
[sql] 
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端写入数据
[plain]  
test() ->  
    Data = [{name, rolong},{phone, 888888}],  
    Bin = term_to_binary(Data),  
    %% 写入数据库的接口依自己情况而定  
    db:execute(<<"insert test(bin) values(~s);">>, [Bin]).  
 
4.3、在PHP中读取并解包成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>';  
    var_dump($data);  
    echo '</pre>';  
 
输出
[php]  
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)  
    }  
  }  
}  
 
补充:Web开发 , php ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,