Categories
php

php reactive socket

php socket 第三方库 composer require react/socket

该库针对 socket / 流 做事件监听(应该是epoll )主线程做事件循环 (reactive)所以该reactive 框架貌似只能在 linux下使用

server

<?php

require '../vendor/autoload.php';

echo "enter script\n";

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server('127.0.0.1:8080', $loop);

$socket->on('connection', function (React\Socket\ConnectionInterface $connection) {
    echo "" . $connection->getRemoteAddress() . "client connected\n";
    $connection->write("Hello " . $connection->getRemoteAddress() . "!\n");
    $connection->write("Welcome to this amazing server!\n");
    $connection->write("Here's a tip: don't say anything.\n");

    $connection->on('data', function ($data) use ($connection) {
        echo "" . $data . "\n";
        //$connection->close();
    });
});

echo "server started at 8080\n";

$loop->run();

其中$loop 就是事件循环对象

client

<?php

require '../vendor/autoload.php';


$loop = React\EventLoop\Factory::create();
$connector = new React\Socket\Connector($loop);

$connector->connect('127.0.0.1:8080')->then(function (React\Socket\ConnectionInterface $connection) use ($loop) {
    echo "client connected\n";
    $connection->write("Hello World!\n");
    $connection->on('data', function ($data) use ($loop, $connection) {
        echo "" . $data . "\n";
        //$connection->close();
        //$output = new React\Stream\WritableResourceStream(fopen("./client.txt", "w"),$loop);
        //$output = fopen("./client.txt", "w");
        //fwrite($output,$data);
        //$output->write("" . $data . "\n");
        while($input = fgets(STDIN, 10))
        {
            echo $input."\n";
            $connection->write($input);

        }
    });
    /*
    $input = new React\Stream\ReadableResourceStream(STDIN,$loop);
    $input->on("data",function ($data) use ($connection) {
       $connection->write($data);
    });*/
    //$output = fopen("./client.txt", "w");
    //$steam = new React\Stream\WritableResourceStream($output,$loop);
    //$connection->pipe($steam);



});

$loop->run();

最亮眼的是 将文件描述符(标准输出流 文件输出流)fd 包装成一个响应式流对象 通过pipe实现管道功能 而且生命周期相同 会同时关闭。

Categories
php

composer 设置aliyun源

composer设置阿里云镜像源

  1. 首先把默认的源给禁用掉

composer config -g secure-http false
 

  1. 再修改镜像源 这里我使用阿里的源

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

  1. 修改成功后可以先查看一下配置

composer config -g -l
 

  1. 第二行repositories.packagist.org.url 如果是阿里的就代表成功

composer config -g -l
[repositories.packagist.org.type] composer
[repositories.packagist.org.url] https://mirrors.aliyun.com/composer/

Categories
java

hytrix

断路器 用作监控请求 是否合理 当出现异常流量 可以短路保护

具体使用方式通过切面编程 将需要监控的方法 包括controller service dao 的方法添加注解方式

然后当执行该方法时 会先进去hystrix定义的监控线程上

异步执行需监控的方法 并注册一个超时事件在 监控线程上

所以被HystrixCommand 注解的方法其实是异步执行的

思考 是否应该在网关应用上 添加hystrix 做断路器限流

的确是应该如此这样做

Categories
php

laravel 入口

php 通过 symfony/http-foundation(http请求响应封装) 框架捕获http请求

laravel kernel 类 为laravel http 入口

middleware 类似于 过滤器 可以执行请求处理 然后next 执行处理链 必定有 handle 方法 当需要处理请求前操作 在调用 $next 前修改请求信息 当需要处理请求后 或者 在响应上操作 则 在$next后 修改信息 且返回结果必定为 $response对象

public function handle($request, Closure $next)
    {
        // Check if we're dealing with CORS and if we should handle it
        if (! $this->shouldRun($request)) {
            return $next($request);
        }

        // For Preflight, return the Preflight response
        if ($this->cors->isPreflightRequest($request)) {
            $response = $this->cors->handlePreflightRequest($request);

            $this->cors->varyHeader($response, 'Access-Control-Request-Method');

            return $response;
        }

        // Add the headers on the Request Handled event as fallback in case of exceptions
        if (class_exists(RequestHandled::class) && $this->container->bound('events')) {
            $this->container->make('events')->listen(RequestHandled::class, function (RequestHandled $event) {
                $this->addHeaders($event->request, $event->response);
            });
        }

        // Handle the request
        $response = $next($request);

        if ($request->getMethod() === 'OPTIONS') {
            $this->cors->varyHeader($response, 'Access-Control-Request-Method');
        }

        return $this->addHeaders($request, $response);
    }
Categories
nodejs

nodejs Stream

nodejs 流对象操作 记录

自定义可写流

const {Writable} = require('stream')

class CounterStream extends Writable {
    


    constructor(options){
        super(options)
        this.counter = 0
    }

    _write(chunk , encoding, callback){
        console.log(chunk.toString("utf-8"))
        this.counter+=chunk.length
        callback.call()
    }

    
}


module.exports = CounterStream

关键在于继承stream.Writeable 并且重写 _write(chunk , encoding, callback)

自定义可读流

const {Readable} = require('stream')

class MyReadableStream extends Readable {
    


    constructor(options){
        super(options)
        this.isFinished = false
    
    }

    _read(size){
        //待处理数据放在this._buffer中
        if(!this.isFinished){
            this.push("abc123")
            this.isFinished = true
        }else{
            this.push(null)
        }
    }
}


module.exports = MyReadableStream

关键在于继承stream.Readable 并且重写 _read(size)

_read 方法中要把数据放到this.push的方法中 且 没有数据读取时 this.push(null) 结束读取

可以从Readable.pipe(Writable) 使用管道的方式 从可读流读取数据 pipe 到可写流中

注意 该方法为异步方法

特殊的流 socket 为双向流 可读可写

process.stdin 标准输入流

process.stdout 标准输出流

process.stderr 标准异常流

把标准输入流输出到标准输出流

const stdin = require('process').stdin
const stdout = require('process').stdout
const stderr = require('process').stderr

stdin.pipe(stdout)

执行后 主线程阻塞 读取标准输入流 读取到数据后 在 标准输出流输出

输入流事件有以下几个

输出流事件

Categories
java microservice php

Sidecar

Spring Cloud Netflix Sidecar框架提供了Sidecar模式的现成解决方案。Spring Cloud Netflix Sidecar框架框架可以提供对其他非Spring Cloud技术栈的微服务的治理。比如,你可以使用Node或者Golang php 编写一个Web项目,这个服务同样可以以Sidecar模式,纳入到Spring Cloud管理中去。

Categories
java

spring integration

类似于数据管道处理的 框架 是一个面向数据的框架

可以兼容多种现有的消息处理框架 包括kafka MQ 等 也可以处理 java 特有JMS消息 RMI Socket 等数据接入点

核心信息用Message 代表

Channel 发送信息 send 拉取信息 receive 订阅消息 subscribe

queue channel 可以缓冲消息

channel interceptor 拦截器了 说明消息处理也是过滤链模式

channel.addInterceptor(Interceptor xxx)

xml 配置说明

spring-integration 可通过xml配置消息处理链 达到代码解耦效果

Categories
php

php 静态变量与全局变量

静态变量 : 在函数内部以static 作为声明前缀

全局变量 : 在函数内部以global作为声明前缀

共同点

静态变量与全局变量当同一方法在一次访问后更新后 能一直维持该值的该值 第二次 也依然能读取上次的赋值

最大的访问域是一个请求 不同请求下的值不一样。(php 一次请求就是一个进程 进程内部变量不能共享)

不同点

静态变量 在方法内部声明 也只能在方法内部使用

全局变量 在任何地方声明 在任何地方调用

且可以通过GLOBALS[‘xxx’]调用

Categories
php

php 字符串模板

$var = "world";
$helloWorld = "hello {$var}";
echo $helloWorld;

双引号自带模板语法功能 花括号自带变量替换功能

Categories
php

php nginx 环境下载

nginx 配置

root /var/www/php;  // 新版本 root 要放在这里次啊能起作用
location   ~\.php$ {
                        root            /var/www/php;
                        index          index.php index.htmlindex.htm;
                        fastcgi_pass    unix:/run/php/php7.4-fpm.sock;
                        fastcgi_index   index.php;
                        include         fastcgi_params;
                }

服务器 安装 php-fpm

然后 nginx 通过unix:/run/php/php7.4-fpm.sock 转发请求到php-fpm上

tips : fastcgi_params 添加以下配置(若访问首页空白)

fastcgi_param SCRIPT_FILENAME     $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO           $fastcgi_script_name;
//从nginx变量 传到  cgi变量(即php变量)

fastcgi_param 参数详解 就是从nginx传过去的变量 可以通过_SERVER 获取

关键变量是

DOCUMENT_ROOT php 项目文件所在文件夹

SCRIPT_NAME php 项目文件

SCRIPT_FILENAME $document_root$fastcgi_script_name; //php 文件全路径

nginx变量 都是$开头小写下划线组合


fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

以上参数可以通过 php $_SERVER[‘SERVER_NAME’] 获取变量值