2020年7月

官方文档里主要介绍了include,require很少,因为它也说了,用法几乎完全一样,唯一区别就是处理失败方式不同。

require

(PHP 4, PHP 5, PHP 7)

require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。

- 阅读剩余部分 -

位与 &

位均为1时,才为1;否则为0.
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。 按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。

位或 |

有一个为1,结果位就位1.

异或 ^

相同为0,不同为1. n^n=0, n^0=n

取反 ~

左移 <<

左移n位就是乘以2的n次方。
1.例: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。

右移 >>

右移n位就是除以2的n次方

左移右移注意有符号数。
左移就是: 丢弃最高位,0补最低位。
右移对符号位的处理和左移不同: 对于有符号整数来说,比如int类型,右移会保持符号位不变。

密码学

对称加密: 私钥加密,双方使用1个密钥加密解密。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有AES、DES、3DES、TDEA、Blowfish、RC5和IDEA。

- 阅读剩余部分 -

复制

mysql支持2种复制方式,基于语句和基于行。语句复制在3.23版本就存在,行复制在5.1版本中才出现。
都是通过主库记录二进制日志,从库重放日志来实现异步数据复制。


- 阅读剩余部分 -

CSR文件和P10文件

  1. CSR:证书签发请求(Certificate Signing Request),或者叫做认证申请,是一个发送到CA的请求认证信息。有两种格式,应用最广泛的是由PKCS#10定义的,另一个用的少的是由SPKAC定义的,主要应用于网景浏览器。
  2. 在PKCS#10定义中,CSR有两种编码格式:二进制(ASN.1或DERàDistinguished Encoding Rules)和文本格式(the text or PEM (Privacy Enhanced Mail) formatted CSR is the binary CSR after it has been Base-64 encoded to create a text version of the CSR.)

- 阅读剩余部分 -

作为文件形式存在的证书一般有这几种格式:

  1.带有私钥的证书

  由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

  2.二进制编码的证书

  证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。

  3.Base64编码的证书

证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。

由定义可以看出,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。

CFCA ACS OCA33 主要用于满足不同领域客户RSA-2048/SHA256 密
码算法的需求,可以签发RSA 2048/SHA256 及 SM2/SM3密钥类型的个人
证书、企业证书、设备证书等。系统的签名算法采用 SM2/SM3 或者RSA2048/SHA256。

观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码
观察者模式实现了低耦合,非侵入式的通知与更新机制。


/**
 * 事件产生类
 * Class EventGenerator
 */
abstract class EventGenerator
{
    private $ObServers = [];

    //增加观察者
    public function add(ObServer $ObServer)
    {
        $this->ObServers[] = $ObServer;
    }

    //事件通知
    public function notify()
    {
        foreach ($this->ObServers as $ObServer) {
            $ObServer->update();
        }
    }

}

/**
 * 观察者接口类
 * Interface ObServer
 */
interface ObServer
{
    public function update($event_info = null);
}

/**
 * 观察者1
 */
class ObServer1 implements ObServer
{
    public function update($event_info = null)
    {
        echo "观察者1 收到执行通知 执行完毕!\n";
    }
}

/**
 * 观察者1
 */
class ObServer2 implements ObServer
{
    public function update($event_info = null)
    {
        echo "观察者2 收到执行通知 执行完毕!\n";
    }
}

/**
 * 事件
 * Class Event
 */
class Event extends EventGenerator
{
    /**
     * 触发事件
     */
    public function trigger()
    {
        //通知观察者
        $this->notify();
    }
}

//创建一个事件
$event = new Event();
//为事件增加旁观者
$event->add(new ObServer1());
$event->add(new ObServer2());
//执行事件 通知旁观者
$event->trigger();

redis服务器serverCron函数每100毫秒执行一次,负责管理服务器资源,保持服务器良好运行。

更新服务器时间缓存

服务器有很多功能需要获取系统当前时间,每次获取时间需要执行一次系统调用,为了减少系统调用执行次数,服务器状态中的unixtime(秒)属性和mstime(毫秒)属性被用来当前时间缓存:
因为100毫秒执行一次,所以这两个时间精度不高,对时间精度要求不高的用这个,要求高的还是执行系统调用。

  • 打印日志、更新LRU时钟、决定是否执行持久化任务、计算服务器上线时间用该属性
  • 为键设置过期时间、添加慢查询日志,会执行系统调用

- 阅读剩余部分 -

参考redis官方文档redis.io

过期键删除策略

1 惰性删除策略
所有读写数据库的Redis命令在执行之前都会先检查输入键是否已过期,过期则删除之。
CPU友好,内存不友好
2 定期删除策略
每当 Redis 的服务器周期性操作函数 serverCron 执行时,就会调用定期删除过期键的函数,(serverCron默认100毫秒执行一次)在规定时间内,分多次遍历服务器中的各个数据库,从数据库的过期字典中随机检查一部分键的过期时间,并删除其中的过期键。
通过全局变量记录当前处理的数据库,直到所有数据库的过期键都被删除。






- 阅读剩余部分 -