Centos7安装swoole2.x协程系列

说明

对于一个合格的 php 后端开发者而言,swoole 的知名度,估计是大家都知道的,swoole 分为 2 个系列,一个是1.9.x系列,一个是2.x系列,两个系列的区别在于1.9系列是原 swoole 成员研发的主分支,2.x系列是由腾讯成员研发的副分支。1.9.x系列底层原生不支持协程的概念,跟着 php 原生态走,但是2.x底层采用的是协程的概念进行研发,基本上需要用到网络 io 的地方在特定的情况下都会去触发协程,记住当前的VM stack的信息,然后通过Eventloop事件去处理别的请求,形成一个相对于原生态的阻塞的执行过程来说,这种非阻塞的处理方式,把 1+2 = 3 的 IO 时间变成了 max(1,2) =2。从而在高并发的请求下,可以更好的承载更多的请求。

之前我有过一篇文章说的就是安装 v2.0.5 的。但是现在重新装一次,说明一下。

下载 git

1
git clone -b v.2.0.9 https://github.com/swoole/swoole-src.git

linux-make-tcpdump

说明

TCPDUMP 可以帮写我们抓包,相当于 window 下的wireshark,为了我们更好的深入分析,我们把 tcpdump 也安装了。

下载

找到最新版,安装 tcpdump 需要把 libpcap 也安装了.

安装 libpcap

下载

1
cd /usr/local/src && sudo mkdir libpcap && sudo wget http://www.tcpdump.org/release/libpcap-1.8.1.tar.gz && sudo tar -zxvf && sudo tar -zxvf libpcap-1.8.1.tar.gz && cd libpcap-1.8.1

Centos7下自行编译PHP

说明

为了满足我的一篇博文,我单独抽出来写一篇 PHP 的编译篇

下载

最好不要去 github 上下载,因为你不知道哪一个是稳定版,我们最好去官网寻找最新的稳定版下载

1
2
3
4
5
6
7
8
9
10
11
cd /usr/local/src/

sudo mkdir php

cd php

wget xxxxx.php -O php-xx.tar.gz

tar -zxvf php-xx.tar.gz

cd php-xx

Systemctl服务管理软件

说明

由于特殊原因!!刚才写的文章没保存下来!!!接下来简写.!!!

Centos7 和 Centos7 之前的版本有几点比较重要的不同,一个是 firewall-cmd 代替了 iptables,然后就是 systemctl 代替了 service。这里,现在我就写一下如何使用 systemctl 管理服务。


服务的基本命令

  • systemctl status xx (服务状态)

  • systemctl start xx (服务启动)

  • systemctl stop xx (停止服务)

  • systemctl restart xx(重启服务)

  • systemctl enable xx (服务随开机启动)

  • systemctl disable xx (服务取消随启动)

  • systemctl cat xx (查看服务的配置信息)

  • systemctl daemon-reload (每次修改了一个 service 配置或者新增了一个配置,都需要执行这个命令,让 systemctl 服务重启,然后重新加载服务配置文件)

  • systemctl list-dependencies [target name](查看依赖树状图,十分的直观好用)


字符编码深度剖析

前言

在这里,我们对如下4种编码进行对比

  • unicode编码
  • utf8编码
  • ascii编码
  • asni编码

ASCII编码和ASNI编码的区别

字符内码(charcter code)指的是用来代表字符的内码.读者在输入和存储文档时都要使用内码,内码分为 单字节内码 – Single-Byte character sets (SBCS),可以支持2558bits = (2^8)-1 = 255)个字符编码. 双字节内码 – Double-Byte character sets)(DBCS),可以支持65000个字符编码(最多支持16 bits = (2^16)-1 = 65535). 前者即为ASCII编码,后者对应ANSI. 至于简体中文编码GB2312,实际上它是ANSI的一个代码页

UNICODE编码

unicode 是一种编码表格,例如,给一个汉字规定一个代码。类似 GB2312-1980, GB18030等,只不过字集不同。 一个unicode码可能转成长度为一个BYTE,或两个,三个,四个BYTE(最多6个byte)的UTF8码,取决于unicode码的值。英文unicode码因为值小于0x80单字节字符),只要用一个BYTE的UTF8传送,比送unicode两个bytes快

如上,ANSI有很多代码页,使用不同代码页的内码无法在其他代码也正常显示,这就是为什么日文版/繁体中文版游戏无法在简体中文平台直接显示的原因.

Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案.它是一种2字节编码,能够提供65535个字符, 这个数字是不够表示所有的字符的(汉语就有55000多字符),所以,通过一个代理对的机制来实现附加的917,476个字符表示,以达到所有字符都具有唯一编码

Unicode和BigEndianUnicode

这两者只是存储顺序不同,如"A"的unicode编码为65 00 其BigEndianUnicode编码为00 65

其实就是类比于我之前说过的大小端的介绍

UTF8编码

UTF8全称:Unicode Transformation Format – 8 bit(unicode转化格式为8位的流数据)

Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节。Unicode为双字节,而UTF-8中汉字占三个字节。

是Unicode传送格式。即把Unicode文件转换成BYTE的传送流。

其中UTF-16和Unicode编码大致一样, UTF-8就是以8位为单元对Unicode进行编码。

UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP(Basic Multilingual Plane)字符最多只用到3字节长。从Unicode到UTF-8的编码方式如下:

Unicode编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
100000 - 1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
200000 - 3FFFFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
4000000 - 7FFFFFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

例如“我”字的Unicode编码是4f6b。4f6b在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将4f6b写成二进制是:100 111101 101011, 用这个比特流依次代替模板中的x,得到:11100100 10111101 10101011,即E4 9C AB。

用PHP实现unicode编码和utf8编码的转变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
/**
* UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP(Basic Multilingual Plane)字符最多只用到3字节长。下面看一下UTF-8编码表:
*
* U-00000000 - U-0000007F: 0xxxxxxx
* U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
* U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
* U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
* U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
* U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
*/
/**
* 单字符汉字转换unicode(16进制)
*
* @param $utf8_str
*
* @return string
*/
function utf8_transform_unicode($utf8_str)
{
$unicode = (ord($utf8_str{0}) & 0xF) << 12;
$unicode |= (ord($utf8_str{1}) & 0x3F) << 6;
$unicode |= (ord($utf8_str{2}) & 0x3F);

return dechex($unicode);
}

/**
* unicode编码转汉字
* @param $unicode
* @return string
*/
function unicode_transform_utf8($unicode)
{
// 十六进制转十进制
$unicode = (int)hexdec($unicode);
$ord_1 = decbin(0xe0 | ($unicode >> 12));
$ord_2 = decbin(0x80 | (($unicode >> 6) & 0x3f));
$ord_3 = decbin(0x80 | ($unicode & 0x3f));
$utf8_str = chr(bindec($ord_1)) . chr(bindec($ord_2)) . chr(bindec($ord_3));

return $utf8_str;

}


$str = '我';
echo utf8_transform_unicode($str);

$unicode = '6211';
echo unicode_transform_utf8($unicode);

后续,我会出一个用php直接实现编码转换和汉字字符串截取的PHP扩展,都会用到这次的知识,后续见。

PHP 实现 Promise+协程调用

  • PHP 实现 Promise+协程调用

github 地址:ccp

觉得好记的给个 Start 喔。

说明

在 PHP 当中,我们或多或少会使用到异步编程的思想,但是异步编程难免给我们带来回调地狱的感觉,并且代码可读性十分之差,在 ES6 规范里面,或者更早就可以推出了一个做 Promise 的东西,利用 Promise,你可以用同步的做法来实现异步的操作,代码可读性上大大提高,不仅如此,由于异步编程和异步 IO 的混合使用,导致代码的准确性难以提高,不可否认的是,Promise 的推出,大大的提高了你们编写异步代码的可靠性,虽然这也是会损耗一些十分微小的性能,但是任何取舍都是相对的。

RabbitMQの关键知识整理

说明

RabbitMQ 作为一个转发服务器,里面涉及了一些实体的东西,如下:

  • 生产者 (Producter)
  • 消息 (Message)
  • 交换机 (Exchange)
  • 队列 (Queue)
  • 消费者 (Consumer)

在这些实体的东西的基础上,RabbitMQ 重点的是 交换机,队列

交换机与队列

说完实体的东西之后,在 交换机队列 之间有许多的规则(玩法),我们增加了如下内容:

  • 队列名 (Queue_name)

  • 交换机类型 (Exchange_type)

  • 路由键 (Routing_key)

大端和小端(Big endian and Little endian)

大端和小端(Big endian and Little endian)

网络字节序

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。

由此可知,网络字节序是大端序的。那么什么是Big endian呢?

一、大端和小端的问题

对于整型、长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。

例如,假设从内存地址 0x0000 开始有以下数据:

0x0000 0x0001 0x0002 0x0003
0x12 0x34 0xab 0xcd

进制转换相关知识

进制转换

好久都没有好好整理过进制之间转换的关系了。最近在研究 RPC 的内容,有一些理论知识必须要重新整理一下。

由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。

但是有一些时候,二进制表示的数据实在的太长了,所以我们可能需要一些更高进制的数来表示数据,而我们从小学习的数学,就是以 10 进制来代表的。

进制数越大,所需要数长度就越短。

我们常用的进制有 2、8、16 进制,分别是 2 的 1 一次方,2 的 3 次方,2 的 4 次方。(至于为什么没有 3 进制,4 进制诸如此类的,各位百度一下吧)