0%

PHP-FPM是PHP FastCGI运行模式的一个进程管理器,并且作为web服务器和php-cli之间的桥梁,负责转发来自web服务器的http请求以及将php处理好的response转发给web服务器。
nginx和php-fpm之间的关系
一、 PHP-FPM有以下特点:

  1. 自从PHP5.4之后,PHP-FPM就汇入php的核心代码里了,在编译的时候”–enable-php-fpm”就可以了
  2. 区别于cgi的启动和退出的模式,php-fpm启动之后就会维护一定数量实现了php-cgi的进程,来处理请求
  3. php-fpm是管理一系列php-cgi的程序,因为php-cgi本身只能解析请求,并不会管理进程,所以需要一个程序来管理一系列进程
  4. php-fpm有两种监听模式,一种是监听TCP端口,另一种为Unix domain socket模式。如果你的web服务器和php-fpm不在同一台机器上时,就只能使用TCP端口模式,当然这种模式需要握手建立连接等过程后才能通信。如果你的web服务器和php-fpm在同一台机器上,就可以使用Unix domain socket,这种模式是可以在同一台机器上的不同进程间使用字节流或者数据队列进行数据通信,理论上会比第一种效率更高一点。

二、 Opcache
首先要了解一次完整的HTTP请求到PHP脚本的过程:
以nginx+php-fpm为例

  1. nginx识别请求的为php脚本,并把请求转给php-fpm
  2. php-fpm将请求进一步交给其中一个子进程
  3. 子进程找到对应的php脚本然后读取,编译成字节码或者操作码,执行
  4. 将生成的响应层一层层返回给http客户端

可以看到,由于php语言本身的特性,php脚本的执行是一边编译一边执行的,而且产生的不是机器码,而是中间码,再由解析器(Zend)来执行,所以速度上取决于编译的速度和解析器的性能。
自从php5.5之后,可以使用官方提供的Opcache,来提高性能。其中的原理就是,将中间码也就是缓存起来,假如第二还是执行同样的文件时,就可以直接将缓存的中间码给解析器解析就行了,省去了编译的过程,一定程度上提高了运行速度。

自己也稍微测试了一下,测试最简单的接口,速度从原来的105ms,下降到了45ms,快了近一倍。
未开启opcache
开启opcache

一、 安装acme.sh

1
2
3
4
5
6
7
8
9
10
11
1.mkdir ~/.acme.sh

2. 在~/.acme.sh目录下运行
curl https://get.acme.sh | sh
等待安装完成

3. alias acme.sh=~/.acme.sh/acme.sh

4. 编译安装socat
wget http://www.dest-unreach.org/socat/download/socat-1.7.3.2.tar.gz
./configure --prefix=$HOME && make && make install

二、 关闭nginx服务器,确保80和443端口是通的
三、使用acme.sh申请和安装证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.acme.sh假装自己是一个webserver,临时监听80端口, 完成验证
acme.sh --issue --standalone -d example.com

安装完成后会告诉你证书的安装地址一般是在/root/.acme.sh/example.com/

2.验证完成之后记得启动nginx服务器
/path/to/nginx/nginx/sbin/nginx

3. 安装证书
acme.sh --installcert -d example.com \
--keypath /path/to/nginx/ssl/example.com.key \
--fullchainpath /path/to/nginx/ssl/example.com.key.pem \
--reloadcmd "/path/to/nginx/nginx/sbin/nginx -s reload"

4. 运行以下命令
openssl dhparam -out /path/to/nginx/ssl/dhparam.pem 2048

四、更新nginx配置文件(放在server模块里面)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
listen   80 ;
listen 443 ssl;
server_name example.com;
charset utf-8;
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
#SSL_START
ssl_certificate /path/to/nginx/ssl/example.com.key.pem;
ssl_certificate_key /path/to/nginx/ssl/example.com.key;
ssl_dhparam /path/to/nginx/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
#SSL_END

然后reload一下nginx,就大功告成了!

了解如何快速使用程序进行排序,对于程序运行速度的提升,对于程序的优化有着很关键的作用,今天先来总结一下几种最基础也是最经典的排序算法。

一、冒泡排序

依次比较相邻两个元素大小,将小的的放前面,大的放后面,直至最后两个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
namespace BubbleSort;

function bubbleSort($array){
if (!is_array($array)){
return false;
}
if (count($array) <2) return $array;
$length = count($array);
for ($i = 0;$i<$length-1; $i++){
for ($j = 0; $j<$length-$i-1;$j++){
if ($array[$j] >$array[$j+1]) {
$temp = $array[$j];
$array[$j] = $array[$j+1];
$array[$j+1] = $temp;
}
}
}
return $array;
}

$arr = [2,6,2,8,2,34,5,9,2341,23];
var_dump(bubbleSort($arr));
?>
Read more »