python—各种常用函数及库

列表
list1.append(x)         将x添加到列表末尾

list1.sort()                对列表元素排序

list1.reverse()            将列表元素逆序

list1.index(x)             返回第一次出现元素x的索引值

list1.insert(i,x)            在位置i处插入新元素x

list1.count(x)                返回元素x在列表中的数量

list1.remove(x)            删除列表中第一次出现的元素x

list1.pop(i)                    取出列表中i位置上的元素,并将其删除

 

元组
元组(tuple)是特殊的序列类型
一旦被创建就不能修改,使得代码更安全
使用逗号和圆括号来表示,如(‘red’,‘blue’,‘green’),(2,4 , 6)
访问方式和列表相同
一般用于表达固定数据项,函数多返回值等情况
特点:

元组中的元素可以是不同类型
元组中各元素存在先后关系,可通过索引访问元组中的数据

math库
math.pi            圆周率

math.ceil(x)        对x向上取整

math.floor(x)        对x向下取整

math.pow(x,y)    x的y次方

math.sqrt(x)          x的平方根

math.fsum(list1)    对集合内的元素求和

更多math库函数请参考:https://docs.python.org/3/library/math.html

 

datetime库
处理时间的标准函数库datetime
datetime.now()获取当前日期和时间
字符串->datetime
datetime.strptime(),解析时间字符串

 

注释:Y表示四位数年份,y表示两位数年份。

datetime->字符串
datetime.strftime(),格式化datetime为字符串显示

 

日期时间格式参考:
https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
isocalendar(),返回年,周数,及周几
更多操作参考:
https://docs.python.org/3/library/datetime.html#module-datetime

 

集合
python中的集合(set)类型同数学中的集合概念一致,即包含0或多个数据项的无序组合
集合中的元素不可重复
集合是无序组合,没有索引和位置的概念
set()函数用于集合的生成,返回结果是一个无重复且排序任意的集合
集合通常用于表示成员间的关系、元素去重等。
集合的操作:

s-t 或 s.difference(t)        返回在集合s中但不在t中的元素
s&t 或 s.intersection(t)       返回同时在集合s和t中的元素
s|t 或 s.union(t)       返回结合s和t中的所有元素
s^t 或 s.symmetric_difference(t)        返回集合s和t中的元素,但不包括同时在其中的元素。
字典
字典类型(dict)是‘’键–值‘’数据项的组合,每个元素是一个键值对。
例如:身份证号(键)–个人信息(值)

字典类型数据通过映射查找数据项
映射:通过任意键查找集合中的值得过程
字典类型以键为索引,一个键对应一个值
字典类型的数据是无序的
基本操作:

定义空字典:        d = dict()

增加一项:        d[key] = value

访问:        d[key]
删除某项:        del d[key]
key是否在字典中:        key in d
字典的遍历:
遍历所有的key:    for key in d.keys():

print(key)

遍历所有的value:    for value in d.values():

print(value)

遍历所有的数据项:    for item in d.items():

print(items)

 

 

random模块
random()        生成一个【0,1.0)之间的随机浮点数
uniform(a,b)        生成一个a到b之间的随机浮点数
randint(a,b)        生成一个a到b之间的随机整数
choice(<list>)        从列表中随机返回一个元素
shuffle(<list>)      将列表中元素随机打乱
sample(<list>,k)        从指定列表中随机获取K个元素
更多random模块的方法请参考:https://docs.python.org/3/library/random.html

 

 

matplotlib模块
matplotlib是一个数据可视化函数库
matplotlib的子模块pyplot提供了2D图表制作的基本函数
例子:https://matplotlib.org/gallery.html
散点图绘制:
import matplotlib.pyplot as plt

#x,y分别是X坐标和Y坐标的列表

plt.scatter(x,y)

plt.show()

 

Numpy
包括:
强大的N维数组对象array

成熟的科学函数库

使用的线性代数,随机数生成函数等

Numpy的操作对象是多维数组ndarray
ndarray.shape 数组的维度

创建数组:np.array(<list>),np.arange()…
改变数组形状 reshape()
Numpy创建随机数组:
np.random.randint(a,b,size)          #创建【a,b)之间,形状为size的数组
————————————————
原文链接:https://blog.csdn.net/weixin_41259130/article/details/79690172

端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手,滑动窗口

TCP状态转移要点TCP状态转移要点    TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。   1、LISTENING状态  FTP服务启动后首先处于侦听(LISTENING)状态。
2、ESTABLISHED状态  ESTABLISHED的意思是建立连接。表示两台机器正在通信。
3、CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭
4、TIME_WAIT
我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。
目前有一种避免TIME_WAIT资源浪费的方法,就是关闭socket的LINGER选项。但这种做法是TCP协议不推荐使用的,在某些情况下这个操作可能会带来错误。
1. socket的状态1.1 状态说明CLOSED 没有使用这个套接字[netstat 无法显示closed状态]LISTEN 套接字正在监听连接[调用listen后]SYN_SENT 套接字正在试图主动建立连接[发送SYN后还没有收到ACK]SYN_RECEIVED 正在处于连接的初始同步状态[收到对方的SYN,但还没收到自己发过去的SYN的ACK]ESTABLISHED 连接已建立CLOSE_WAIT 远程套接字已经关闭:正在等待关闭这个套接字[被动关闭的一方收到FIN]FIN_WAIT_1 套接字已关闭,正在关闭连接[发送FIN,没有收到ACK也没有收到FIN]CLOSING 套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认[在FIN_WAIT_1状态下收到被动方的FIN]LAST_ACK 远程套接字已关闭,正在等待本地套接字的关闭确认[被动方在CLOSE_WAIT状态下发送FIN]FIN_WAIT_2 套接字已关闭,正在等待远程套接字关闭[在FIN_WAIT_1状态下收到发过去FIN对应的ACK]TIME_WAIT 这个套接字已经关闭,正在等待远程套接字的关闭传送[FIN、ACK、FIN、ACK都完毕,这是主动方的最后一个状态,在过了2MSL时间后变为CLOSED状态]1.2 状态变迁图摘自《UNIX 网络编程 卷1:套接字联网API》 P35

 

2. TCP的三次握手和四次挥手2.1 总结图左边为客户端的状态转变,后边为服务器的状态转变

 

2.2 说明2.2.1   connect返回-1
errno=110(ETIMEDOUT),当服务器端网线拔了的时候,客户端发送SYN过去就会收不到ACK,因此就会出现这个错误,1分钟内就会返  回这个错误。
errno=111(ECONNREFUSED),当服务器未listen时,就会报这个错
2.2.2 ESTABLISHED不一定真的establish
会出现这种情况:client为ESTABLISHED状态而server为SYN_REVD状态。
这是因为LINUX不像其他操作系统在收到SYN为该连接立马分配一块内存空间用于存储相关的数据和结构,而是延迟到接收到client的ACK,即三次握手    真正完成后才分配空间,这是为了防范SYN flooding攻击。 如果是这种情况,那么就会出现client端未ESTABLISHED状态,server为SYN_RECV状态。
并且server的SYN_RECV状态在一定时间后会消失,client的established状态也会消失。这是因为server在SYN_RECV状态时,会像client发送多次的SYN+ACK(因为他以为自己的这个包对方没收到),发送的次数定义在/proc/sys/net/ipv4/tcp_synack_retries中,默认为5.在发送5次之后还没有收到ACK,就将其回收了,所以用netstat查看就看不到这个SYN_RECV状态了。并且会像client发送RST信号。这就会导致client的这种半连接最后也会消失。这个可以通过tcpdump抓包得到(最好知道src这样看到的包比较集中)。

TIME_WAIT处理方法  实现的目标就是不要让处于TIME_WAIT的端口占满所有本地端口,导致没有新的本地端口用来创建新的客户端。  1. 别让客户端的速率太快  似乎上面的案例告诉我们别优化用力过猛,否则容易扯到蛋……将客户端请求的速率降下来就可以避免端时间占用大量的端口,吞吐量限制就是470tps或者235tps,具体根据系统TIME_WAIT默认时长决定,如果考虑到其他服务正常运行这个值还要保守一些才行;此外还需要注意,如果客户端和服务端增加了一层NAT或者L7负载均衡,那么这个限制可能会在负载均衡器上面;  2. 客户端改成长连接的形式  长连接效率高又不会产生大量TIME_WAIT端口。目前对我们来说还是不太现实的,虽然HTTP支持长连接,但是CGI调用应该是不可能的了,除非用之前的介绍的方式将CGI的请求转换成HTTP服务来实现。对于一般socket直连的程序来说,短连接改成长连接就需要额外的封装来标识完整请求在整个字节流中的起始位置,需要做一些额外的工作;  3. SO_LINGER选项  通常我们关闭socket的时候,即使该连接的缓冲区有数据要发送,close调用也会立即返回,TCP本身会尝试发送这些未发送出去的数据,只不过应用程序不知道也无法知道是否发送成功过了。如果我们将套接字设置SO_LINGER这个选项,并填写linger结构设置参数,就可以控制这种行为:  如果linger结构的l_onoff==0,则linger选项就被关闭,其行为就和默认的close相同;如果打开,那么具体行为依据另外一个成员l_linger的值来确定:如果l_linger!=0,则内核会将当前close调用挂起,直到数据都发送完毕,或者设置的逗留时间超时返回,前者调用会返回0并且正常进入TIME_WAIT状态,后者调用会返回EWOULDBLOCK,所有未发送出去的数据可能会丢失(此处可能会向对端发送一个RST而快速关闭连接);如果l_linger==0,则直接将缓冲区中未发送的数据丢弃,且向对等实体发送一个RST,自己不经过TIME_WAIT状态立即关闭连接。  我们都认为TIME_WAIT是TCP机制的正常组成部分,应用程序中不应该依赖设置l_linger=0这种机制避免TIME_WAIT。  4. 修改系统参数  (a). 增加本地端口范围,修改net.ipv4.ip_local_port_range,虽然不能解决根本问题但情况可以得到一定的缓解;  (b). 缩短TIME_WAIT的时间。这个时长在书中描述到RFC推荐是2min,而BSD实现通常是30s,也就说明这个值是可以减小的,尤其我们用在内网通信的环境,数据包甚至都流不出路由器,所以根本不需要设置那么长的TIME_WAIT。这个很多资料说不允许修改,因为是写死在内核中的;也有说可以修改netfilter.ip_conntrack_tcp_timeout_time_wait(新版本nf_conntrack_tcp_timeout_time_wait)的,他们依赖于加载nf_conntract_ipv4模块,不过我试了一下好像不起作用。  (c). 像之前在项目中推荐的,做出如下调整
net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_timestamps=1net.ipv4.tcp_tw_recycle=1       很多文献说这种设置是不安全的,所以在测试环境以外就别尝试了,因为这些选项还涉及到timestamp特性,我还不清楚什么回事,后面有时间再看什么吧。  我们在开发服务端的时候,通常都会设置SO_REUSEADDR这个选项。其实像上面描述到的,该选项也牵涉到侦听socket端口处于TIME_WAIT的情况,设置这个选项将允许处于TIME_WAIT的端口进行绑定

另外一文:        记得以前面试的时候被面试官问起TIME_WAIT有什么痛点,当时只记得TCP三次握手、四次挥手之类的,至于其中的某个状态还真是记不起来,之前也没有过多关注过,还有对于拥塞控制的概念也比较模糊。
TCP报文格式TCP大家都知道是什么东西,这个协议的具体报文格式如下:

 

标志位URG:指示报文中有紧急数据,应尽快传送(相当于高优先级的数据)。PSH:为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。RST:TCP连接中出现严重差错(如主机崩溃),必须释放连接,在重新建立连接。FIN:发送端已完成数据传输,请求释放连接。SYN:处于TCP连接建立过程。 (Synchronize Sequence Numbers)ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
窗口      滑动窗口大小,这个字段是接收端用来告知发送端自己还有多少缓冲区可以接受数据。于是发送端可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。(以此控制发送端发送数据的速率,从而达到流量控制。)窗口大小时一个16bit字段,因而窗口大小最大为65535。
头部长度(首部长度)      由于TCP首部包含一个长度可变的选项和填充部分,所以需要这么一个值来指定这个TCP报文段到底有多长。或者可以这么理解:就是表示TCP报文段中数据部分在整个TCP报文段中的位置。该字段的单位是32位字,即:4个字节。TCP的滑动窗口大小实际上就是socket的接收缓冲区大小的字节数。
选项和填充部分      TCP报文的字段实现了TCP的功能,标识进程、对字节流拆分组装、差错控制、流量控制、建立和释放连接等。其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,那么选项部分最长为:(2^4-1)*(32/8)-20=40字节。
三次握手

 

最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。
TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了**LISTEN(监听)**状态;      TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的**同部位SYN=1,同时选择一个初始序列号 seq=x **,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。      TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了**SYN-RCVD(同步收到)**状态。这个报文也不能携带数据,但是同样要消耗一个序号。      TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入**ESTABLISHED(已建立连接)**状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。      当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。      三次握手主要目的是:信息对等和防止超时。防止超时导致脏连接。如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
四次挥手

 

数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。
客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务器的确认请求后,此时,客户端就进入**FIN-WAIT-2(终止等待2)**状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了**LAST-ACK(最后确认)**状态,等待客户端的确认。客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。      TIME_WAIT:主动要求关闭的机器表示收到了对方的FIN报文,并发送出了ACK报文,进入TIME_WAIT状态,等2MSL后即可进入到CLOSED状态。如果FIN_WAIT_1状态下,同时收到待FIN标识和ACK标识的报文时,可以直接进入TIME_WAIT状态,而无需经过FIN_WAIT_2状态。
CLOSE_WAIT:被动关闭的机器收到对方请求关闭连接的FIN报文,在第一次ACK应答后,马上进入CLOSE_WAIT状态。这种状态其实标识在等待关闭,并且通知应用发送剩余数据,处理现场信息,关闭相关资源。
为什么客户端最后还要等待2MSL?      MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。**第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失。**站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。如果客户端收到服务端的FIN+ACK报文后,发送一个ACK给服务端之后就“自私”地立马进入CLOSED状态,可能会导致服务端无法确认收到最后的ACK指令,也就无法进入CLOSED状态,这是客户端不负责任的表现。**第二,防止失效请求。**防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
在TIME_WAIT状态无法真正释放句柄资源,在此期间,Socket中使用的本地端口在默认情况下不能再被使用。该限制对于客户端机器来说是无所谓的,但对于高并发服务器来说,会极大地限制有效连接的创建数量,称为性能瓶颈。所以建议将高并发服务器TIME_WAIT超时时间调小。RFC793中规定MSL为2分钟。但是在当前的高速网络中,2分钟的等待时间会造成资源的极大浪费,在高并发服务器上通常会使用更小的值。      在服务器上通过变更/etc/sysctl.conf文件来修改该默认值net.ipv4.tcp_fin_timout=30(建议小30s)。修改完之后执行 /sbin/sysctl -p 让参数生效。      通过如下命令查看各连接状态的技术情况:
[root@node1 ~]# netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’TIME_WAIT 63ESTABLISHED 13为什么建立连接是三次握手,关闭连接确是四次挥手呢?      建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
滑动窗口      TCP滑动窗口技术通过动态改变窗口大小来调节两台主机间数据传输。每个TCP/IP主机支持全双工数据传输,因此TCP有两个滑动窗口:一个用于接收数据,另一个用于发送数据。TCP使用肯定确认技术,其确认号指的是下一个所期待的字节。 假定发送方设备以每一次三个数据包的方式发送数据,也就是说,窗口大小为3。发送方发送序列号为1、2、3的三个数据包,接收方设备成功接收数据包,用序列号4确认。发送方设备收到确认,继续以窗口大小3发送数据。当接收方设备要求降低或者增大网络流量时,可以对窗口大小进行减小或者增加,本例降低窗口大小为2,每一次发送两个数据包。当接收方设备要求窗口大小为0,表明接收方已经接收了全部数据,或者接收方应用程序没有时间读取数据,要求暂停发送。发送方接收到携带窗口号为0的确认,停止这一方向的数据传输。当链路变好了或者变差了这个窗口还会发生变话,并不是第一次协商好了以后就永远不变了。
滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。 只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。
流量控制:端到端,接收端的应用层处理速度决定和网速无关,由接收端返回的rwnd控制
cwnd:发送端窗口( congestion window )rwnd:接收端窗口(receiver window)
拥塞控制      拥塞控制: 发送端主动控制cwnd,有慢启动(从cwnd初始为1开始启动,指数启动),拥塞避免(到达ssthresh后,为了避免拥塞开始尝试线性增长),快重传(接收方每收到一个报文段都要回复一个当前最大连续位置的确认,发送方只要一连收到三个重复确认就知道接收方丢包了,快速重传丢包的报文,并TCP马上把拥塞窗口 cwnd 减小到1),快恢复(直接从ssthresh线性增长)。
如果网络上的延时突然增加,那么TCP对这个事作出的应对只有重传数据,但是重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,于是这个情况就会进入恶性循环被不断地放大。试想一下,如果一个网络内有成千上万的TCP连接都这么行事,那么马上就会形成“网络风暴”,TCP这个协议就会拖垮整个网络。所以TCP不能忽略网络上发生的事情,而无脑地一个劲地重发数据,对网络造成更大的伤害。对此TCP的设计理念是:TCP不是一个自私的协议,当拥塞发生的时候,要做自我牺牲。就像交通阻塞一样,每个车都应该把路让出来,而不要再去抢路了。
慢启动      只有在TCP连接建立和网络出现超时时才使用。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间RTT。不过“传输轮次”更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。另外,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法如下:
当 cwnd < ssthresh 时,使用上述的慢开始算法。当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。      拥塞避免算法:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

 

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。
当TCP连接进行初始化时,把拥塞窗口cwnd置为1。前面已说过,为了便于理解,图中的窗口单位不使用字节而使用报文段的个数。慢开始门限的初始值设置为16个报文段,即 cwnd = 16 。       在执行慢开始算法时,拥塞窗口 cwnd 的初始值为1。以后发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值另1,然后开始下一轮的传输(图中横坐标为传输轮次)。因此拥塞窗口cwnd随着传输轮次按指数规律增长。当拥塞窗口cwnd增长到慢开始门限值ssthresh时(即当cwnd=16时),就改为执行拥塞控制算法,拥塞窗口按线性规律增长。      假定拥塞窗口的数值增长到24时,网络出现超时(这很可能就是网络发生拥塞了)。更新后的ssthresh值变为12(即变为出现超时时的拥塞窗口数值24的一半),拥塞窗口再重新设置为1,并执行慢开始算法。当cwnd=ssthresh=12时改为执行拥塞避免算法,拥塞窗口按线性规律增长,每经过一个往返时间增加一个MSS的大小。      强调:“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
如果发送方设置的超时计时器时限已到但还没有收到确认,那么很可能是网络出现了拥塞,致使报文段在网络中的某处被丢弃。这时,TCP马上把拥塞窗口 cwnd 减小到1,并执行慢开始算法,同时把慢开始门限值ssthresh减半。这是不使用快重传的情况。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认。

 

接收方收到了M1和M2后都分别发出了确认。现在假定接收方没有收到M3但接着收到了M4。显然,接收方不能确认M4,因为M4是收到的失序报文段。根据可靠传输原理,接收方可以什么都不做,也可以在适当时机发送一次对M2的确认。但按照快重传算法的规定,接收方应及时发送对M2的重复确认,这样做可以让发送方及早知道报文段M3没有到达接收方。发送方接着发送了M5和M6。接收方收到这两个报文后,也还要再次发出对M2的重复确认。这样,发送方共收到了接收方的四个对M2的确认,其中后三个都是重复确认。快重传算法还规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段M3,而不必继续等待M3设置的重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。

 

与快重传配合使用的还有快恢复算法,其过程有以下两个要点:
当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢启动门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。      上图给出了快重传和快恢复的示意图,并标明了“TCP Reno版本”。区别:新的 TCP Reno 版本在快重传之后采用快恢复算法而不是采用慢开始算法。
发送方窗口的上限值 = Min [ rwnd, cwnd ]
当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。
差错控制TCP使用差错控制来提供可靠性。差错控制包括以下的一些机制:检测和重传受到损伤的报文段、重传丢失的报文段、保存失序到达的报文段直至缺失的报文到期,以及检测和丢弃重复的报文段。TCP通过三个简单的工具来完成其差错控制:检验和、确认以及超时。

原文链接:https://blog.csdn.net/zzhongcy/article/details/38851271

mysql 查询当天、本周,本月,上一个月的数据

今天

select * from 表名 where to_days(时间字段名) = to_days(now());

昨天

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1

近7天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)

近30天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)

本月

SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )

上一月

SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1

查询本季度数据

select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(now());

查询上季度数据

select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));

查询本年数据

select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());

查询上年数据

select * from `ht_invoice_information` where year(create_date)=year(date_sub(now(),interval 1 year));

查询当前这周的数据

SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now());

查询上周的数据

SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,'%Y-%m-%d')) = YEARWEEK(now())-1;

查询上个月的数据

复制代码
select name,submittime from enterprise where date_format(submittime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')

select * from user where DATE_FORMAT(pudate,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m') ; 

select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) = WEEKOFYEAR(now()) 

select * from user where MONTH(FROM_UNIXTIME(pudate,'%y-%m-%d')) = MONTH(now()) 

select * from user where YEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) = YEAR(now()) and MONTH(FROM_UNIXTIME(pudate,'%y-%m-%d')) = MONTH(now()) 
select * from user where pudate between  上月最后一天  and 下月第一天
复制代码

查询当前月份的数据 

select name,submittime from enterprise   where date_format(submittime,'%Y-%m')=date_format(now(),'%Y-%m')

查询距离当前现在6个月的数据

select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();

php5.5.56安装swoole扩展

wget https://github.com/swoole/swoole-src/archive/swoole-1.7.6-stable.tar.gz

tar zxvf swoole-1.7.6-stable.tar.gz

cd swoole-1.7.6-stable

phpize

./configure

make && make install

最后要修改下php.ini  添加extension=swoole.so

重启php-fpm

php -m查看有没有swoole即可
————————————————

原文链接:https://blog.csdn.net/qq_39889272/article/details/81137188

mysql报错Changed limits: max_open_files: 5000

OS:CentOS 7.4
DB:mysql 5.7.17
error.log日志里报错信息:

  1. 2018-04-08T09:52:52.641263Z 0 [Warning] Changed limits: max_open_files: 5000 (requested 50000)
  2. 2018-04-08T09:52:52.641467Z 0 [Warning] Changed limits: max_connections: 4190 (requested 10000)
  3. 2018-04-08T09:52:52.641476Z 0 [Warning] Changed limits: table_open_cache: 400 (requested 2000)

看到这个错误第一反应是去数据库查查当前的参数都是多少,和日志里提示的是一样的

  1. mysql> show variables like ‘%files%’;
  2. +—————————+——–+
  3. | Variable_name | Value |
  4. +—————————+——–+
  5. | character_set_filesystem | binary |
  6. | innodb_log_files_in_group | 2 |
  7. | innodb_open_files | 400 |
  8. | keep_files_on_create | OFF |
  9. | large_files_support | ON |
  10. | open_files_limit | 5000 |
  11. +—————————+——–+
  12. 6 rows in set (0.00 sec)
  13. mysql> show variables like ‘%connections%’;
  14. +———————-+——-+
  15. | Variable_name | Value |
  16. +———————-+——-+
  17. | max_connections | 4190 |
  18. | max_user_connections | 0 |
  19. +———————-+——-+
  20. 2 rows in set (0.00 sec)
  21. mysql> show variables like ‘%table_open_cache%’;
  22. +—————————-+——-+
  23. | Variable_name | Value |
  24. +—————————-+——-+
  25. | table_open_cache | 400 |
  26. | table_open_cache_instances | 16 |
  27. +—————————-+——-+
  28. 2 rows in set (0.01 sec)

看到是max_open_files,难道是操作系统限制了?也没有啊

  1. [root@iz2ze6jo3o3bqbcongnypoz mysql]# ulimit -n
  2. 65535

my.cnf文件里也没有对这些参数做修改,因为是用mysqld.service启动的,难道是这个文件的问题吗?

  1. [root@iz2ze6jo3o3bqbcongnypoz system]# more /usr/lib/systemd/system/mysqld.service
  2. # Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
  3. #
  4. # This program is free software; you can redistribute it and/or modify
  5. # it under the terms of the GNU General Public License as published by
  6. # the Free Software Foundation; version 2 of the License.
  7. #
  8. # This program is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. # GNU General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU General Public License
  14. # along with this program; if not, write to the Free Software
  15. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  16. #
  17. # systemd service file for MySQL forking server
  18. #
  19. [Unit]
  20. Description=MySQL Server
  21. Documentation=man:mysqld(8)
  22. Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
  23. After=network.target
  24. After=syslog.target
  25. [Install]
  26. WantedBy=multi-user.target
  27. [Service]
  28. User=mysql
  29. Group=mysql
  30. Type=forking
  31. PIDFile=/var/run/mysqld/mysqld.pid
  32. # Disable service start and stop timeout logic of systemd for mysqld service.
  33. TimeoutSec=0
  34. # Execute pre and post scripts as root
  35. PermissionsStartOnly=true
  36. # Needed to create system tables
  37. ExecStartPre=/usr/bin/mysqld_pre_systemd
  38. # Start main service
  39. ExecStart=/usr/sbin/mysqld –daemonize –pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
  40. # Use this to switch malloc implementation
  41. EnvironmentFile=-/etc/sysconfig/mysql
  42. # Sets open_files_limit
  43. LimitNOFILE = 5000

果然是…把这个参数修改为65535后,重启mysql,问题消失了。

  1. LimitNOFILE = 5000 这个值默认就是5000,下面这篇文档说清楚这个事了:
https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20893244/viewspace-2152685/,

mysql 查看表的创建时间的语句。

创建表的是有时间的。那么要看所有表的创建时间怎么办呢。

这里有下面的这个语句。

 

 

select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = ‘DBNAME’ order by create_time desc;

例如:数据库的名字叫做AI。那么就是

 

select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = ‘AI’  order by create_time desc;

 

这样就会把数据库所有表都查出来,然后会按照时间排序。

原文链接:https://blog.csdn.net/hxdafei1989/article/details/61916043

CentOS7.4 源码编译安装LNMP

1、基于CentOS7.4源码编译安装得lnmp

系统环境CentOS 7.4

系统最小化安装,只安装了一些常用包(vim、lirzs、gcc*、wget、bash-completion)

nginx版本1.14.0

mysql版本5.7.20

php版本7.2.6

1.1 下载网络yum源

[root@centos7_4 ~]# wget http://mirrors.aliyun.com/repo/Centos-7.repo -P /etc/yum.repos.d/    #这里安装的是阿里的网络源,epel扩展源,也可以安装阿里的,但是阿里的epel源有些包不全,所以下面就直接用yum安装网络epel源

[root@centos7_4 ~]# yum -y install epel-release

[root@centos7_4 ~]# ls /etc/yum.repos.d/

back  Centos-7.repo  CentOS-Media.repo  epel.repo  epel-testing.repo

[root@centos7_4 ~]# yum clean all;yum makecache

2 源码编译安装nginx

2.1 安装依赖包:

[root@centos7_4 ~]# yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre*

2.2 创建nginx运行用户

[root@centos7_4 ~]# useradd -M -s /sbin/nologin nginx

下载pcre包

[root@centos7_4 ~]# wget https://jaist.dl.sourceforge.net/project/pcre/pcre/8.42/pcre-8.42.zip

[root@centos7_4 ~]# unzip pcre-8.42.zip -d /usr/local/src/

2.3 下载nginx源码包并解压

[root@centos7_4 ~]# wget http://nginx.org/download/nginx-1.14.0.tar.gz

[root@centos7_4 ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/local/src/

[root@centos7_4 ~]# cd /usr/local/src/nginx-1.14.0/

[root@centos7_4 nginx-1.14.0]# ./configure –prefix=/usr/local/nginx \

–with-http_dav_module \

–with-http_stub_status_module \

–with-http_addition_module \

–with-http_sub_module \

–with-http_flv_module \

–with-http_mp4_module \

–with-http_ssl_module \

–user=nginx \

–group=nginx \

–with-pcre=/usr/local/src/pcre-8.42 \     #这个是可选项,如果yum安装了依赖包这里也可以不用

2.4 编译并安装

[root@centos7_4 nginx-1.14.0]# echo $?

0

[root@centos7_4 nginx-1.14.0]# make

[root@centos7_4 nginx-1.14.0]# echo $?

0

[root@centos7_4 nginx-1.14.0]# make install

[root@centos7_4 nginx-1.14.0]# echo $?

0

2.5 修改配置文件

[root@centos7_4 nginx-1.14.0]# vim /usr/local/nginx/conf/nginx.conf

user  nginx nginx;      #修改用户和组

location ~ \.php$ {

root           html;

fastcgi_pass   127.0.0.1:9000;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;    #修改路径

include        fastcgi_params;

}

2.6 添加环境变量,优化nginx服务

[root@centos7_4 ~]# /usr/local/nginx/sbin/nginx -t                    #检查nginx语法是否正确

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@centos7_4 ~]# /usr/local/nginx/sbin/nginx            #安装好的启动路径

[root@centos7_4 ~]# vim /etc/profile                      #添加环境变量

export PATH=$PATH:/usr/local/nginx/sbin

[root@centos7_4 ~]# source /etc/profile

[root@centos7_4 ~]# nginx

[root@centos7_4 ~]# netstat -antup|grep nginx

tcp    0    0 0.0.0.0:80        0.0.0.0:*       LISTEN      7417/nginx: master

[root@centos7_4 ~]# vim /etc/init.d/nginx         #配置启动脚本

#!/bin/bash

# chkconfig: 2345 99 20

#description: nginx-server

nginx=/usr/local/nginx/sbin/nginx

case $1 in

start)

netstat -anptu | grep nginx

if [ $? -eq 0 ]

then

echo “nginx service is already running”

else

echo “nginx Service started successfully ”

$nginx

fi

;;

stop)

$nginx -s stop

if [ $? -eq 0 ]

then

echo “nginx service closed successfully”

else

echo “nginx server stop fail,try again”

fi

;;

status)

netstat -anlpt | grep nginx

if [ $? -eq 0 ]

then

echo “nginx server is running”

else

echo “nginx service not started ”

fi

;;

restart)

$nginx -s reload

if [ $? -eq 0 ]

then

echo “nginx service restart successfully ”

else

echo “nginx server restart failed”

fi

;;

*)

echo “please enter {start restart status stop}”

;;

esac

[root@centos7_4 ~]# chmod +x /etc/init.d/nginx

[root@centos7_4 ~]# chkconfig –add nginx

[root@centos7_4 ~]# chkconfig nginx on

配置nginx以守护进程方式启动

[root@centos7_4 ~]# vim /lib/systemd/system/nginxd.service

[Unit]
Description=The Nginx HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
EnvironmentFile=/usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[root@centos7_4 ~]# systemctl daemon-reload

[root@centos7_4 ~]# systemctl restart nginxd.service

[root@centos7_4 ~]# systemctl enabled nginxd.service

3 源码安装MySQL

3.1 卸载系统自带的mariadb*

[root@centos7_4 ~]# yum -y remove mariadb* boost-*

3.2 安装依赖包

[root@centos7_4 ~]# yum install -y cmake make gcc gcc-c++ bison ncurses ncurses-devel

3.3 下载源码包

[root@centos7_4 ~]# wget https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.20.tar.gz

3.4 解压源码包

[root@centos7_4 ~]# tar zxf mysql-boost-5.7.20.tar.gz -C /usr/local/src/

3.5 配置编译并安装

[root@centos7_4 ~]# cd /usr/local/src/mysql-5.7.20/

[root@centos7_4 mysql-5.7.20]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/usr/local/mysql/data \

-DDOWNLOAD_BOOST=1 \

-DWITH_BOOST=/usr/local/src/mysql-5.7.20/boost/boost_1_59_0 \

-DSYSCONFDIR=/etc \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DWITH_FEDERATED_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \

-DMYSQL_TCP_PORT=3306 \

-DENABLED_LOCAL_INFILE=1 \

-DENABLE_DTRACE=0 \

-DEXTRA_CHARSETS=all \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci \

-DMYSQL_USER=mysql \

 

编译并安装

[root@centos7_4 mysql-5.7.20]# make

[root@centos7_4 mysql-5.7.20]# make install

3.6 创建数据库用户和数据目录

[root@centos7_4 ~]# useradd -M -s /sbin/nologin -r mysql

[root@centos7_4 ~]# mkdir -p /usr/local/mysql/data          #创建数据存储目录

[root@centos7_4 ~]# chown -R mysql.mysql /usr/local/mysql/     #更改属主数组为MySQL

3.7 配置my.cnf文件

[root@centos7_4 ~]# vim /etc/my.cnf             #以下是简单配置

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

port=3306

socket=/usr/local/mysql/mysql.sock

symbolic-links=0

character-set-server=utf8

pid-file=/usr/local/mysql/mysqld.pid

log-error=/var/log/mysqld.log

 

3.8 配置MySQL启动脚本

[root@centos7_4 mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld                      #复制启动脚本到/etc/init.d

[root@centos24 mysql-5.7.20]# ll /etc/init.d/mysqld                          #默认拥有执行权限

-rwxr-xr-x 1 root root 10576 Jun  7 19:27 /etc/init.d/mysqld

[root@centos7_4 mysql]# chkconfig –add mysqld                #添加到开机启动项

[root@centos7_4 mysql]# chkconfig mysqld on                   #添加开机自启动

[root@centos7_4 mysql]# vim /etc/init.d/mysqld                #修改路径

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

[root@centos7_4 mysql]# vim /etc/profile                       #配置环境变量

export PATH=$PATH:/usr/local/mysql/bin

[root@centos7_4 mysql]# source /etc/profile                 #加载变量立即生效

配置MySQL启动脚本,这个和上面的二选一都可以

[root@centos7_4 system]# vim mysqld.service

[Unit]

Description=MySQL DBMS

 

[Service]

LimitNOFILE=10000

Type=simple

User=mysql

Group=mysql

PIDFile=/usr/local/mysql/mysqld.pid

ExecStart=/usr/local/mysql/bin/mysqld_safe –datadir=/usr/local/mysql/data

ExecStop=/bin/kill -9 $MAINPID

 

[Install]

WantedBy=multi-user.target

[root@centos7_4 system]# chmod +x mysqld.service               #添加执行权限

[root@centos7_4 system]# systemctl enable mysqld.service       #设置开机启动

3.9 安全初始化数据库

[root@centos7_4 ~]# /usr/local/mysql/bin/mysqld –initialize-insecure –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data      #这样初始化之后,数据库是没有密码的

如果要想初始化之后分配临时密码,可以将–initialize-insecure 红色部分去掉,初始化之后,可以分配到一个临时密码。

[root@centos7_4 ~]# /etc/init.d/mysqld start                     #启动数据库

Starting MySQL. SUCCESS!

[root@centos7_4 ~]# mysql -uroot                         #登录数据库修改root用户密码

mysql> alter user ‘root’@’localhost’ identified by ‘123456’;

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

4 源码编译安装PHP

4.1 安装依赖包

[root@centos7_4 ~]# yum -y install php-mcrypt libmcrypt libmcrypt-devel  autoconf  freetype gd libmcrypt libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel re2c net-snmp-devel libjpeg-devel php-ldap openldap-devel openldap-servers openldap-clients freetype-devel gmp-devel

4.2 下载PHP源码包

[root@centos7_4 ~]# wget http://cn2.php.net/distributions/php-7.2.6.tar.gz

4.3 解压压缩包

[root@centos7_4 ~]# tar zxf php-7.2.6.tar.gz -C /usr/local/src/

[root@centos7_4 ~]# cd /usr/local/src/php-7.2.6/

4.4 生成配置文件

[root@centos7_4 php-7.2.6]# ./configure –prefix=/usr/local/php \

–with-config-file-path=/usr/local/php/etc \

–with-mysqli \

–with-pdo-mysql \

–with-mysql-sock=/usr/local/mysql/mysql.sock \

–with-iconv-dir \

–with-freetype-dir \

–with-jpeg-dir \

–with-png-dir \

–with-curl \

–with-gd \

–with-gmp \

–with-zlib \

–with-xmlrpc \

–with-openssl \

–without-pear \

–with-snmp \

–with-gettext \

–with-mhash \

–with-libxml-dir=/usr \

–with-ldap \

–with-ldap-sasl \            #如果不添加这两项,要是安装zabbix监控时候,会有提示还得需要再次编译,如果不安装zabbix,也可以忽略

–with-fpm-user=nginx \

–with-fpm-group=nginx \

–enable-xml \

–enable-fpm  \

–enable-ftp \

–enable-bcmath \

–enable-soap \

–enable-shmop \

–enable-sysvsem \

–enable-sockets \

–enable-inline-optimization \

–enable-maintainer-zts \

–enable-mbregex \

–enable-mbstring \

–enable-pcntl \

–enable-zip \

–disable-fileinfo \

–disable-rpath \

–enable-libxml \

–enable-opcache \

–enable-mysqlnd \

 

configure: error: Cannot find ldap libraries in /usr/lib.       #解决方法

[root@centos7_4 php-7.2.6]# cp -frp /usr/lib64/libldap* /usr/lib/    #在重新配置

4.5 编译并安装

[root@centos7_4 php-7.2.6]# make

/usr/bin/ld: ext/ldap/.libs/ldap.o: undefined reference to symbol ‘ber_strdup’

/usr/lib64/liblber-2.4.so.2: error adding symbols: DSO missing from command line

collect2: error: ld returned 1 exit status

make: *** [sapi/cli/php] Error 1

 

[root@centos7_4 php-7.2.6]# vim Makefile      #在以EXTRA_LIBS开头的一行结尾添加‘-llber’

EXTRA_LIBS = -lcrypt -lz -lresolv -lcrypt -lrt -lldap -lgmp -lpng -lz -ljpeg -lz -lrt -lm -ldl -lnsl -lpthread -lxml2 -lz -lm -ldl -lssl -lcrypto -lcurl -lxml2 -lz -lm -ldl -lssl -lcrypto -lfreetype -lxml2 -lz -lm -ldl -lnetsnmp -lssl -lssl -lcrypto -lm -lxml2 -lz -lm -ldl -lcrypt -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lxml2 -lz -lm -ldl -lssl -lcrypto -lcrypt -llber

[root@centos7_4 php-7.2.6]# make

[root@centos7_4 php-7.2.6]# echo $?

0

[root@centos7_4 php-7.2.6]# make install

[root@centos7_4 php-7.2.6]# echo $?

0

4.6 配置php配置文件

移动php配置文件的位置,并修改名称

[root@centos7_4 php-7.2.6]# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.conf

复制php.ini文件

[root@centos7_4 php-7.2.6]# cp /usr/local/src/php-7.2.6/php.ini-production /usr/local/php/etc/php.ini

4.7 复制php启动脚本到/etc/init.d/

[root@centos7_4 php-7.2.6]# cp /usr/local/src/php-7.2.6/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

添加执行权限,添加到启动项并设置卡机启动

[root@centos7_4 php-7.2.6]# chmod +x /etc/init.d/php-fpm

[root@centos7_4 php-7.2.6]# chkconfig –add php-fpm

[root@centos7_4 php-7.2.6]# chkconfig php-fpm on

启动php-fpm

[root@centos7_4 ~]# /etc/init.d/php-fpm start

Starting php-fpm  done

 

[root@centos7_4 ~]# vim /usr/local/nginx/conf/nginx.conf

43         location / {

44             root   html;

45             index  index.php index.html index.htm;

46         }

[root@centos7_4 ~]# service nginx restart     #重启nginx服务

 

编写php探测文件

[root@centos7_4 ~]# vim /usr/local/nginx/html/index.php

<?php

phpinfo();

?>

[root@centos7_4 ~]# netstat -antup|grep php-fpm

tcp    0    0 127.0.0.1:9000      0.0.0.0:*      LISTEN    128974/php-fpm: mas

 

通过浏览器测试

 

到这里整个实验已经完成了,新手上路,有什么写的不完善,还请各位大神多提宝贵意见

yum安装php7.2

0.更换yum原

# yum install epel-release
# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

1.安装php

# yum install php72w

2.安装php扩展根据自己需求来

复制代码
php72w-cli 
php72w-common 
php72w-devel 
php72w-embedded 
php72w-fpm 
php72w-gd 
php72w-mbstring 
php72w-mysqlnd 
php72w-opcache 
php72w-pdo 
php72w-xml 
php72w 
php72w-bcmath 
php72w-dba 
php72w-enchant 
php72w-imap 
php72w-interbase
php72w-intl 
php72w-ldap  
php72w-mcrypt 
php72w-odbc 
php72w-pdo_dblib 
php72w-pear 
php72w-pecl-apcu 
php72w-pecl-imagick 
php72w-pecl-xdebug 
php72w-pgsql 
php72w-phpdbg 
php72w-process 
php72w-pspell 
php72w-recode 
php72w-snmp 
php72w-soap 
php72w-tidy 
php72w-xmlrpc 
php72w-pecl-igbinary 
php72w-intl 
php72w-memcached 
php72w-pecl-mongodb
复制代码

3.查看php版本

[root@php ~]# php -v
PHP 7.2.7 (cli) (built: Jul  1 2018 08:22:47) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.7, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans

4.配置文件所在地址

php.ini             /etc/php.ini
php加载ini文件       /etc/php.d/*.ini
php-fpm.conf        /etc/php-fpm.conf    
php-fpm.pid         /var/run/php-fpm/php-fpm.pid
php-fpm启动          php-fpm

5.扩展swoole

1)安装依赖包

复制代码
# yum -y install postgresql-devel
 
# yum install glibc-headers gcc-c++ git-core gcc autoconf cmake libcurl4-openssl-dev openssl libssl-dev build-essential zlibc zlib-bin libidn11-dev libidn11 minizip openssl-devel

下载nghttp2依赖
# wget nghttp2下载地址
# tar -zxvf nghttp2
# cd nghttp2
# ./configure
# make
# make install

下载hiredis依赖
# wget hiredis下载地址
# tar -zxvf hiredis
# cd hiredis
# make
# make install
复制代码

2)安装swoole

# pecl install swoole

3)根据自己的情况来选择yes or no 本次示范全部选为yes

复制代码
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading swoole-4.0.3.tgz ...
Starting to download swoole-4.0.3.tgz (903,874 bytes)
.........................................done: 903,874 bytes
304 source files, building
running: phpize
Configuring for:
PHP Api Version:         20170718
Zend Module Api No:      20170718
Zend Extension Api No:   320170718
enable debug/trace log support? [no] : yes
enable sockets supports? [no] : yes
enable openssl support? [no] : yes
enable http2 support? [no] : yes
enable async-redis support? [no] : yes
enable mysqlnd support? [no] : yes
enable postgresql coroutine client support? [no] :
复制代码

4.安装完成

复制代码
Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3" install
Installing shared extensions:     /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/lib64/php/modules/
Installing header files:          /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/include/php/
running: find "/var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3" | xargs ls -dils
266121     4 drwxr-xr-x 3 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3
266172     4 drwxr-xr-x 4 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr
526626     4 drwxr-xr-x 3 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/include
526627     4 drwxr-xr-x 3 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/include/php
526628     4 drwxr-xr-x 3 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/include/php/ext
526629     4 drwxr-xr-x 3 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/include/php/ext/swoole
526631     8 -rw-r--r-- 1 root root     4300 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/include/php/ext/swoole/config.h
526630     4 drwxr-xr-x 2 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/include/php/ext/swoole/include
526623     4 drwxr-xr-x 3 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/lib64
526624     4 drwxr-xr-x 3 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/lib64/php
526625     4 drwxr-xr-x 2 root root     4096 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/lib64/php/modules
526622 12268 -rwxr-xr-x 1 root root 12560576 Aug  1 23:00 /var/tmp/pear-build-rootPmvfF4/install-swoole-4.0.3/usr/lib64/php/modules/swoole.so

Build process completed successfully
Installing '/usr/lib64/php/modules/swoole.so'
Installing '/usr/include/php/ext/swoole/config.h'
install ok: channel://pecl.php.net/swoole-4.0.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=swoole.so" to php.ini
复制代码

5.加入swoole.so加入ini

在 /etc/php.d/下新建并并写入
# vim /etc/php.d/swoole.ini
    ; Enable swoole extension module
    extension=swoole.so
:wq

6.查看php扩展

复制代码
[PHP Modules]
apcu
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
enchant
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
igbinary
imagick
imap
intl
json
ldap
libxml
mbstring
memcached
mongodb
mysqli
mysqlnd
odbc
openssl
pcntl
pcre
PDO
pdo_dblib
pdo_mysql
PDO_ODBC
pdo_pgsql
pdo_sqlite
pgsql
Phar
posix
pspell
readline
recode
redis
Reflection
session
shmop
SimpleXML
snmp
soap
sockets
SPL
sqlite3
standard
swoole
sysvmsg
sysvsem
sysvshm
tidy
tokenizer
wddx
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
Zend OPcache
zip
zlib

[Zend Modules]
Xdebug
Zend OPcache


文章来源:https://www.cnblogs.com/hello-tl/p/9404655.html

使用dd命令增加swap(虚拟内存)大小

1)创建Swap文件
[root@MoYan ~]# dd if=/dev/zero of=/data/swapfile bs=1M count=4096
将/dev/zero内容写入/data/swapfile,读写块大小1024bytes ,块个数4096。
/dev/zero是个未使用的文件模版,可以用它来创建“干净”的文件。后两个参数可以控制文件大小。
2)把这个文件变成swap文件
[root@MoYan ~]# mkswap /data/swapfile
3)激活使用这个swap文件
[root@MoYan ~]# swapon /data/swapfile
查看状态:
[root@MoYan ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2031608 0 -1
/data/swapfile file 4194296 0 -2

4)设置开机启用
[root@DBT_A dev]# vi /etc/fstab ,添加如下内容
/data/swapfile swap swap defaults 0 0

删除多余的swap空间
1)使用Swapoff命令收回Swap空间。
swapoff swapfile
2)编辑/etc/fstab文件,去掉此Swap文件的实体。
3)从文件系统中回收此文件。
rm swapfile
————————————————

原文链接:https://blog.csdn.net/allen_a/article/details/77835989

nginx+php-fpm配置后页面显示空白的解决方法

由于nginx与php-fpm之间的一个小bug,会导致这样的现象: 网站中的静态页面 *.html 都能正常访问,而 *.php 文件虽然会返回200状态码, 但实际输出给浏览器的页面内容却是空白。 简而言之,原因是nginx无法正确的将 *.php 文件的地址传递给php-fpm去解析, 相当于php-fpm接受到了请求,但这请求却指向一个不存在的文件,于是返回空结果。 为了解决这个问题,需要改动nginx默认的fastcgiparams配置文件: vi /etc/nginx/fastcgi_params 在文件的最后增加两行:

 

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;

 

然后重启一下服务:

 

service php5-fpm reload service nginx reload //重新加载各项配置改动。
————————————————
原文链接:https://blog.csdn.net/feiniao8651/article/details/52768911