根据端口汇总连接ip

netstat -ant|grep -v TIME_WAIT|awk -F '[[:space:]:]+' '{print $6"\t"$4":"$5}'|sort|uniq -c|sort -rg|grep :5672|head -n 20
  • netstat -ant打印端口使用情况
    • a:全部
    • n:显示端口号
    • t: 只看tcp连接
  • |grep -v TIME_WAIT去掉TIME_WAIT状态的连接(netstat中不加-n也可以)
  • |awk -F '[[:space:]:]+' '{print $6"\t"$4":"$5}' 用空格和冒号拆分字符串,并重新拼接,只保留远程IP,本地IP和本地端口。
    • -F 设置分隔符
    • {print $6} 打印第6个参数
  • |sort|uniq -c 先用sort排序然后通过uniq -c做分类汇总
    • -c将计数加入到第一列
  • |sort -rg 重新排序
    • -r:倒序排列
    • -g:以数字的方式排序
  • |grep :5672 只找端口号为5672的
  • |head -n 20 取前20条
netstat -ant|grep -v TIME_WAIT|awk '{match($4"\t"$5, /^([0-9\.]+:[0-9]+)\t([0-9\.]+):[0-9]+$/, a); if(a[1]) print a[2]"\t"a[1]}'|sort|uniq -c|sort -rg|grep 5672|head -n 20
  • 通过match做精确匹配

php禁用xdebug的彩色html var_dump

这个功能有时会麻烦,直接看请求结果很乱,而且会忽略掉一些大的字段,可以通过这哥参数禁用

ini_set('xdebug.overload_var_dump', 0);
ini_set('html_errors', 0);

docker镜像中缺少的命令

docker的镜像中可能会少很多常用命令,比如vim之类的,有些可以apt install vim 这样根据命令名安装,而有些命令是在别的包里。这里列出一些:

  • ps:apt install -y procps
  • netstat:apt install -y iputils
  • ping:apt install -y iputils-ping
  • netstat: apt install -y net-tools

用PHP做gRPC的服务端

gRPC的官方文档中虽然没有给出PHP做Server的例子,但实际上grpc的扩展是支持的。

参考扩展中提供的几个类以及扩展内部的一些代码,写了一个简单的示例

这个示例只是证明PHP可以直接写gRPC服务,不代表可以在生产环境中这么用。主要原因有这么几点:

  1. 不借助pcntl或swoole的话是个单进程的服务,并发会阻塞
  2. 没做性能测试以及是否有内存泄漏的测试
  3. 而且直接PHP做Server的争议也比较大

完整示例代码(https://github.com/ssfyn/php-grpc-server-example

Server端的主要逻辑:

$this->server = new \Grpc\Server([]);
$this->server->addHttp2Port('0.0.0.0:50051');
$this->server->start();

while($request = $this->server->requestCall()){
    $method = $request->method;
    $call = $request->call;
    if ($method=='/dev.fyn.HelloWorld/SayHello') {
        //接收请求
        $recv = $call->startBatch([
            \Grpc\OP_RECV_MESSAGE => true
        ]);
        //将请求的数据转换为对象
        $request = new SayHelloRequest();
        $request->mergeFromString($recv->message);
        //调用业务代码
        $impl = new HelloWorldImpl();
        $response = $impl->sayHello($request);
        //处理返回值,即使没有metadata也要设置OP_SEND_INITIAL_METADATA,不然会一直阻塞在这里
        $call->startBatch([
            \Grpc\OP_SEND_INITIAL_METADATA => [],
            \Grpc\OP_SEND_MESSAGE => [
                'message'=>$response->serializeToString()
            ],
            \Grpc\OP_SEND_STATUS_FROM_SERVER => [
                'code'=>\Grpc\STATUS_OK,
                'details'=>'OK'
            ],
        ]);
    } else {
        $call->startBatch([
            \Grpc\OP_SEND_INITIAL_METADATA => [],
            \Grpc\OP_SEND_STATUS_FROM_SERVER => ['code'=>\Grpc\STATUS_NOT_FOUND,'details'=>'Not found'],
        ]);
    }
}

Mac安装PHP+GRPC

安装xcode命令行工具

xcode-select --install

安装brew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

通过brew安装php5.6(或其它版本)

brew install php@5.6

通过brew安装php切换器

brew install brew-php-switcher

切换php版本

brew-php-switcher 5.6

通过pecl安装PHP的protobuf扩展(要编译,比较慢)

pecl install protobuf

通过pecl安装PHP的grpc扩展(要编译,比较慢)

pecl install grpc