Sproto PHP Extension Bind
The future net protocol Sproto was implemented by many language listed in sproto_wiki how does it can be absenced in php world Here is the php implementation
#prerequisite
generate c2s.spb and s2c.spb with sprotodump
lua sprotodump.lua -spb c2s.proto -o c2s.spb
lua sprotodump.lua -spb s2c.proto -o s2c.spb
#How To use
<?php
require 'sproto.php';
$sproto=new Sproto();
$sproto->load_proto_from_file('s2c', 's2c.spb');
$sproto->load_proto_from_file('c2s', 'c2s.spb');
$sproto->dumpproto('s2c');//see if the dumped proto right
$sproto->dumpproto('c2s');//see if the dumped proto right
//encde and decode
$buffer=$sproto->encode('c2s', 'get.request', array('what'=>'want_some_key'));
$ret=$sproto->decode('c2s', 'get.request', $buffer);
var_dump($ret);
//make request
//notice the request session id must be the same with the response session id
$reqbuffer=$sproto->request('c2s', 'get', array('what'=>'wanted'),10001);
$ret=$sproto->dispath('c2s', $reqbuffer);
var_dump($ret);
//make response
//notice the response session id must be the same with the request session id
$resbuffer=$sproto->response('c2s', 'get', array('result'=>'wanted_is_here'),10001);
$ret=$sproto->dispath('c2s', $resbuffer);
var_dump($ret);
#Here is a complicated example
require 'sproto.php';
$sproto=new Sproto();
$sproto->load_proto_from_file('s2c', 's2c.spb');
$sproto->load_proto_from_file('c2s', 'c2s.spb');
$e=0;$t=0;
$send_session=1;
//assume skynet gate server listen on 127.0.0.1:8888
$s=fsockopen('127.0.0.1',8888,$e,$t,1000);
stream_set_blocking($s, 0);
//send the handshake to server
$hand=$sproto->request('c2s', 'handshake', array(),$send_session++);
fwrite($s, Sproto::netpack($hand));
//set something
// $hand=$sproto->request('c2s', 'set', array('what'=>'hello','value'=>'hello from c programmer dietoad'),10001);
// fwrite($s, Sproto::netpack($hand));
$hand=$sproto->request('c2s', 'set', array('what'=>'yes','value'=>'yes message from php'),$send_session++);
fwrite($s, Sproto::netpack($hand));
// stream_set_blocking(STDIN,0);
while(1)
{
$len=array();
$header=fread($s, 2);
if($s&&$header)
{
//header size is a 2bytes big endian unsigned short
$len=unpack('nlen', $header);
var_dump($len);
}
if(!empty($len['len']))
{
$len=$len['len'];
$left=$len;
$readed=0;
$r='';
$buffer='';
//read until we have enough bytes
while($readed!=$len)
{
$r=fread($s, $left);
$buffer.=$r;
$read_len=strlen($r);
$readed+=$read_len;
$left-=$read_len;
}
//unpacked the netpackage receive from the server
$unpacked=Sproto::unpack($buffer);
$disp=$sproto->dispath('c2s',$unpacked);
print_r($disp);
$receive_session=!empty($disp['session'])?$disp['session']:0;
if($receive_session==($send_session-1))
{
echo "type hello or yes and press enter\n";
$cx=fgets(STDIN);
if($cx)
{
$reqbuffer=$sproto->request('c2s','get',array('what'=>trim('yes')), $send_session++);
echo strlen($reqbuffer),"\n";
fwrite($s, Sproto::netpack($reqbuffer));
}
}
}
usleep(100000);
}
#Problems there is some naughty BUGS in the php master version 7.2