这里 我用了 easyswoole 框架
需要在框架里 才能使用
此篇的代码只贴出部分 不能达到运行的效果
server 端
public static function mainServerCreate(ServerManager $server,EventRegister $register): void
{
// TODO: Implement mainServerCreate() method.
$tcp = ServerManager::getInstance()->addServer('tcp', 9504, SWOOLE_TCP, '0.0.0.0', [
'open_length_check' =>true, //打开包长检测特性
'package_length_type' => 'L', //see php pack()
'package_length_offset' => 0,
'package_body_offset' => 4,//从第几个字节开始计算长度 包头长度为N字节 仅包含包体,package_body_offset设置为N
]);
$tcp->set($tcp::onReceive,function(\swoole_server $server,$fd,$from_id,$data){
Redis::getInstance()->getConnect()->rPush('redisData',json_encode([
'fd'=>$fd,
'data'=>base64_encode($data)
],true)
);
});
for($i=0;$i<65;$i++){
ProcessManager::getInstance()->addProcess("RedisQueue_{$i}", RedisQueue::class);
}
}
RedisQueue.php
class RedisQueue extends AbstractProcess
{
protected static $skdarr = [624,626,679];
public function run(Process $process)
{
// Http::getInstance()->doHttp();
while (1){
try{
$redis = Redis::getInstance()->getConnect();
$data = $redis->lPop('redisData');
if($data){
$json = json_decode($data,true);
$jdata = base64_decode($json['data']);
$res = $this->doSdk($jdata);
// Logger::getInstance()->log(microtime(true).$res,'getRes');
ServerManager::getInstance()->getServer()->send($json['fd'],$res);
}
}catch(\Throwable $exception){
Logger::getInstance()->log($exception->getMessage(),'lpop');
}
//usleep(1000);
}
}
public function doSdk($data)
{
Protobuf::autoload();
$unpack = HelpFunc::getInstance()->unPackData($data);
var_dump($unpack);
if($unpack){
if (in_array($unpack['num'][1], self::$skdarr)) {
$name = "sdk" . $unpack['num'][1];
$Ans = HelpFunc::getInstance()->StructNum($unpack['num'][1]);
$res = $this->$name($Ans, $unpack['data']);
return $res;
}
}
}
HelpFunc.php
//$req 为对象
function pack($num,$req){
$second_data = $req->serialize();
$second_len = pack("L*",strlen($second_data) + 4);
$second_num = pack("L*",$num);
$second_pack = $second_len.$second_num.$second_data;
return $second_pack;
}
function unPackData($data){
$rev_len = unpack("L*",substr($data,0,4));//前面 设置了 open_length_type
$rev_num = unpack("L*",substr($data,4,4));
if($rev_len){
if(!empty($rev_len[1]))
$rev_data = substr($data,8,($rev_len[1])-4);
$data_array = array(
'len' =>$rev_len,
'num' =>$rev_num,
'data'=>$rev_data,
// 'cname' =>rand(1111,9999). Random::randStr(6)
);
return $data_array;
}
}
客户端 与服务端 协议必须一致 同时 pack 和 unpackDate 也是通用的
test1.php
use DrSlump\Protobuf;
require_once 'test.php';
Protobuf::autoload();
$start = microtime(true);
echo $start;
for ($i=0;$i<3000;$i++){
$sdkLogin = \App\Sock\Parser\Tcp::send626();//生成pack 包
$data= base64_encode($sdkLogin);
$fh = fopen(EASYSWOOLE_ROOT.'/testdata.txt','a+');
fwrite($fh,$data."\n");
fclose($fh);
}
echo "\n";
$end = microtime(true);
echo $end;
test2.php
require_once 'test.php';
$client = new \swoole_client(SWOOLE_SOCK_TCP);
$client->connect('127.0.0.1',9504);
$start = microtime(true);
if(is_file(EASYSWOOLE_ROOT.'/testdata.txt')){
$data = file(EASYSWOOLE_ROOT.'/testdata.txt');
if($data){
$len =count($data);
$i = 0;
while($i<$len-1){
var_dump($i);
$tdata = base64_decode(rtrim($data[$i]));
$client->send($tdata);
$i++;
}
}
}
$end = microtime(true);
var_dump($start . '++++++'.$end);
test.php
<?php
/**
* Created by PhpStorm.
* User: yf
* Date: 2018/3/5
* Time: 下午10:06
*/
require 'vendor/autoload.php';
\EasySwoole\Core\Core::getInstance()->initialize();