杨 发布的文章

本文转自 https://www.laruence.com/2020/02/25/3182.html

php5

php5中hashtable结构


typedef struct _hashtable {
uint nTableSize;        /* 散列表大小, Hash值的区间 */
uint nTableMask;        /* 等于nTableSize -1, 用于快速定位 */
uint nNumOfElements;    /* HashTable中实际元素的个数 */
ulong nNextFreeElement; /* 下个空闲可用位置的数字索引 */
Bucket *pInternalPointer;   /* 内部位置指针, 会被reset, current这些遍历函数使用 */
Bucket *pListHead;      /* 头元素, 用于线性遍历 */
Bucket *pListTail;      /* 尾元素, 用于线性遍历 */
Bucket **arBuckets;     /* 实际的存储容器 */
dtor_func_t pDestructor;/* 元素的析构函数(指针) */
zend_bool persistent;
unsigned char nApplyCount; /* 循环遍历保护 */
zend_bool bApplyProtection;
#if ZEND_DEBUG
int inconsistent;
#endif
} HashTable;

- 阅读剩余部分 -

官方文档里主要介绍了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时钟、决定是否执行持久化任务、计算服务器上线时间用该属性
  • 为键设置过期时间、添加慢查询日志,会执行系统调用

- 阅读剩余部分 -