swoole 开启 open length

这里 我用了 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();






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值