2020年7月

外观(Facade)模式
当使用子系统的代码时,你也许会发现自己过于深入地调用子系统的逻辑代码。如果子系统代码总是在不断变化,而你的代码却又在许多不同地方与子系统代码交互,那么随着子系统的发展,你也许会发现维护代码变得非常困难。

在项目中集成复杂的第三方代码,或在系统中逐渐形成大量仅在系统自身内部有用的代码,在这些情况下,你总可以应用外观模式,为复杂的系统创建一个简单、清晰的接口。

假设有下面一段很乱的代码,其功能是从文件中获取log信息并将它转换为对象。

用 laravel 框架举例
Laravel中我们常用到的Route、Redis、Auth这些Facade就是外观模式的具体实现, 在Laravel中设计了多个外观类,每个外观类继承自统一的抽象外观类,在抽象外观类里提供了通过外观类访问其背后子系统的基础方法。


class Client

{

    public function main()

    {

        (new Facade)->operation();

    }

}

 

class Facade

{

    private $systemA;

    private $systemB;

     

    public function __construct()

    {

        $this->systemA = new SystemA;

        $this->systemB = new SystemB;

    }

     

    public function operation()

    {

        $this->systemA->operationA();

        $this->systemB->operationB();

    }

}

 

class SystemA

{

    public function operationA()

    {

        //

    }

}

 

class SystemB

{

    public function operationB()

    {

        //

    }

}

模式分析
根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。 -外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度,同时降低客户类与子系统类的耦合度。 - 外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。 -外观模式的目的在于降低系统的复杂程度。 -外观模式从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。

原文:https://www.php.cn/phpkj/laravel/407270.html

一 tcp关键结构信息

  • 源端口号和目的端口:各占2字节,与ip首部ip地址组成一个唯一的tcp连接。
  • 序号和确认序号:4字节,无符号,是本报文段的第一个字节的序号,例如,一报文段的序号为300,而且数据共100字节,则下一个报文段的序号就是400;序号是32bit的无符号数,序号到达2^32-1后从0开始。确认序号是期望收到对方下次发送数据的第一个字节的序号,确认序号应该是上次已成功收到数据字节序号+1。只有ACK标志为1时,确认序号才有效。
  • 标志位:6个,各占1位。

    • SYN:请求建立连接;
    • ACK:当ACK=1,确认序号有效;
    • FIN:发送端发送完成,请求断开连接;
    • URG:注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长;
    • PSH:接收方应该尽快将本报文段立即传送给其应用层。
    • RST:重置连接。
  • 窗口:16位,65535,tcp通过滑动窗口进行流量控制,设想发送方发送速度很快,而接收方接受速度很慢,为了保证数据不丢,而进行流量控制。所谓滑动窗口,可理解为接收方所需要缓冲区的大小。

- 阅读剩余部分 -

git log --author=" "

查看某个时间之前的记录

git log --pretty=format:"%h - %an, %ar : %s"

查看某个时间区间内的记录

git log --since ==2017-09-01 --until=2017-09-28 

在网上看别人分享的,侵删。

从几个角度入手

1 业务角度

了解系统面向的用户是谁,有哪些功能,对外上下游服务有哪些,对接人是谁

2 技术角度

系统有哪些子系统,相互调用关系,使用什么框架,这个框架会有哪些问题,有哪些不合理的地方,有哪些可以优化的地方

3 架构角度

使用哪些中间件,依赖哪些服务,数据体量多大,有哪些异步任务

4 运维角度

系统怎么部署,有多少机器,有没有多机房容器化部署,什么情况容易出问题,出问题如何快速定位&解决,日志怎么管理,有没有监控报警

wc、awk、split、diff、grep、sed

wc 计算字数,在默认的情况下,wc将计算指定文件的行数、字数,以及字节数

参数:

  • -c或--bytes或--chars 只显示Bytes数。
  • -l或--lines 只显示行数。
  • -w或--words 只显示字数。
  • --help 在线帮助。
  • --version 显示版本信息。

split 分割文件,在默认情况下将按照每1000行切割成一个小文件
参数说明:

  • -<行数> : 指定每多少行切成一个小文件
  • -b<字节> : 指定每多少字节切成一个小文件
  • --help : 在线帮助
  • --version : 显示版本信息
  • -C<字节> : 与参数"-b"相似,但是在切 割时将尽量维持每行的完整性
  • [输出文件名] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号

diff 比较文件,diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。

参数:

-<行数>  指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
-a或--text  diff预设只会逐行比较文本文件。
-b或--ignore-space-change  不检查空格字符的不同。
-B或--ignore-blank-lines  不检查空白行。
-c  显示全部内文,并标出不同之处。
-C<行数>或--context<行数>  与执行"-c-<行数>"指令相同。
-d或--minimal  使用不同的演算法,以较小的单位来做比较。
-D<巨集名称>或ifdef<巨集名称>  此参数的输出格式可用于前置处理器巨集。
-e或--ed  此参数的输出格式可用于ed的script文件。
-f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
-H或--speed-large-files  比较大文件时,可加快速度。
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
-i或--ignore-case  不检查大小写的不同。
-l或--paginate  将结果交由pr程序来分页。
-n或--rcs  将比较结果以RCS的格式来显示。
-N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:
Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-p  若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
-P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
-q或--brief  仅显示有无差异,不显示详细的信息。
-r或--recursive  比较子目录中的文件。
-s或--report-identical-files  若没有发现任何差异,仍然显示信息。
-S<文件>或--starting-file<文件>  在比较目录时,从指定的文件开始比较。
-t或--expand-tabs  在输出时,将tab字符展开。
-T或--initial-tab  在每行前面加上tab字符以便对齐。
-u,-U<列数>或--unified=<列数>  以合并的方式来显示文件内容的不同。
-v或--version  显示版本信息。
-w或--ignore-all-space  忽略全部的空格字符。
-W<宽度>或--width<宽度>  在使用-y参数时,指定栏宽。
-x<文件名或目录>或--exclude<文件名或目录>  不比较选项中所指定的文件或目录。
-X<文件>或--exclude-from<文件>  您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
-y或--side-by-side  以并列的方式显示文件的异同之处。
--help  显示帮助。
--left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
--suppress-common-lines  在使用-y参数时,仅显示不同之处。

sed sed 可依照脚本的指令来处理、编辑文本文件。主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。linux sed

php5.4开始,php-fpm正式成为php进程管理工具,可以有效控制内存和进程、可以平滑重载PHP配置。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

使用PHP-FPM来控制PHP-CGI的FastCGI进程
/usr/local/php/sbin/php-fpm{start|stop|quit|restart|reload|logrotate}
--start 启动php的fastcgi进程
--stop 强制终止php的fastcgi进程
--quit 平滑终止php的fastcgi进程
--restart 重启php的fastcgi进程
--reload 重新平滑加载php的php.ini
--logrotate 重新启用log文件

配置说明

php-fpm配置文件

1.listen, 接收fastCGI请求的地址

2.pm参数,表示master进程控制子进程的工作模式

1.pm=static,始终保持固定数量的worker进程数,不会动态扩容。由pm.max_children决定。

2.pm=dynamic,表示动态调整子进程数量,但是至少会有1个子进程。具体策略如下:

  • pm.max_children :同一时刻最大子进程数。
  • pm.start_servers :启动时创建的子进程数。默认值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2
  • pm.min_spare_servers:空闲状态子进程数量最小值,如果空闲进程数量少于这个值,则会创建子进程。
  • pm.max_spare_servers:空闲状态子进程数量最小值,如果空闲进程数量多于这个值,则会杀死子进程。

启动php-fpm时会根据pm.start_servers初始worker进程数,运行期间会动态调整数量,通过定时器,动态检查闲置worker数量,按一定策略调整worker数量,增加或减少。
优缺点
优点:动态扩容与缩容,不浪费系统资源
缺点:所有worker都在工作,新来的请求会有可能等待1秒,直到新创建的worker成功。

3.pm=ondemand,初始时不启动worker,只有请求来了才按需创建。pm.process_idle_timeout参数决定了,空闲超过该值的子进程将被kill掉,默认10秒。同一时刻进程数最多不超过pm.max_children。

优点:按需创建,不浪费资源
缺点:由于php-fpm是短连接,若每次请求都需要创建连接,频繁创建连接会影响并发性能。
默认是dynamic,在性能与资源上做一个平衡。

3.php_admin_value[memory_limit]

内存大小,默认32M。

master-worker

php-fpm的master进程只是负责监听管理worker进程,worker进程负责接收请求和处理。
worker进程挂掉时会给master进程发信号,master进程接收到信号后会新建一个worker继续处理。

一 概念

字符集
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集(中文)、BIG5字符集、 GB18030字符集(中文)、Unicode字符集等。计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编码,是中文信息交流的技术基础。

字符编码
字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号编号,并用7比特的二进制来表示这个整数。通常会额外使用一个扩充的比特,以便于以1个字节的方式存储。




- 阅读剩余部分 -