Iawen's Blog

我喜欢这样自由的随手涂鸦, 因为我喜欢风......

1. PHP的编译安装

1.1 PHP的获取:

1.2 常用库和工具的安装

yum install -y gcc gcc-c++ make autoconf net-tools wget perl curl
yum install -y \
    libxml2 libxml2-devel \
    libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel \
    zlib zlib-devel glibc glibc-devel \
    glib2 glib2-devel ncurses ncurses-devel \
    openssl-devel bzip2 bzip2-devel libcurl-devel \
    t1lib-devel gmp-devel libc-client-devel openldap-devel unixODBC-devel \
    mysql-devel expat-devel libxslt-devel libmcrypt libmcrypt-devel libedit \
    gdbm-devel db4-devel libXpm-devel libX11-devel gd-devel readline-devel \
    libxslt-devel expat-devel xmlrpc-c xmlrpc-c-devel bison-devel

1.3 编译 PHP

./configure \
    --prefix=/usr/local/php7 \
    --with-zlib-dir --with-freetype-dir --with-libxml-dir \
    --with-curl --with-mcrypt --with-gd --with-jpeg-dir \
    --with-mysqli --with-pcre-regex \
    --with-gettext --with-xmlrpc --with-xsl --with-mhash \
    --with-openssl --with-iconv --with-bz2 --with-zlib \
    --enable-mbstring --enable-soap --enable-calendar \
    --enable-inline-optimization --enable-sockets --enable-sysvsem \
    --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif \
    --enable-bcmath --enable-gd-native-ttf --enable-ftp --enable-opcache \
    --disable-rpath --enable-fpm --enable-zip
  • enable 多代表不依赖外部库便可以直接编译, 而with大多需要依赖于第三方的lib
  • 出现错误: Don’t know how to define struct flock on this system, set –enable-opcache=no, 多半是依赖库问题
vi /etc/ld.so.conf.d/local.conf     # 编辑库文件
/usr/local/lib                      # 添加该行
ldconfig                            # 使之生效

# 编译安装时出现 undefined reference to `libiconv' 错误的解决方法
make ZEND_EXTRA_LIBS='-liconv'

编译安装后, 查看PHP的编译参数:

php -i | grep configure

1.4 PHP扩展的安装

  • 获取源码包
  • 进入插件目录:
/usr/local/php/bin/phpize 
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

# 之后, 在php.ini文件中启用该扩展
# extension=xxxxxx
/usr/local/php7/bin/php --ri swoole
./configure --with-php-config=/usr/local/php7/bin/php-config --enable-openssl --enable-sockets

2. 配置PHP.ini并重启PHP

2.1 php-fpm运行用户进行设置

cd /usr/local/php
cp etc/php-fpm.conf.default etc/php-fpm.conf
vi etc/php-fpm.conf

# 用户与组
user = www-data
group = www-data

# 隐藏PHP版本信息
expose_php = Off

# 查看php-fpm的status
pm.status_path = /status # 路径随你自己配置

# MySQL的socket设置
pdo_mysql.default_socket = 
mysqli.default_socket = 

# php-fpm进程池优化
pm = dynamic
pm.max_children = 15
pm.start_servers = 8
pm.min_spare_servers = 6
pm.max_spare_servers = 15
pm.max_requests = 500

php-fpm进程池开启进程有两种方式:

  • 一种是: static (静态的), 直接开启指定数量的php-fpm进程,不再增加或者减少
  • 一种是: dynamic (动态的), 开始时开启一定数量的php-fpm进程, 当请求量变大时, 动态的增加php-fpm进程数达到上限, 当空闲时自动释放空闲的进程数到一个下限。
    (生产环境中, 根据服务器实际需求来进行调整)

要用到的一些参数 , 分别是 pm, pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers

pm表示使用哪种方式, 有两个值可以选择。staic或者dynamic
例: pm = dynamic
pm.max_children: 静态方式下指开启的php-fpm进程数量, 在动态方式下限定php-fpm的最大进程数。
pm.start_servers: 动态方式下的起始php-fpm进程数量。
pm.min_spare_servers: 动态方式空闲状态下的最小php-fpm进程数量。ps: spare(空闲的)
pm.max_spare_servers: 动态方式下空闲状态的最大php-fpm进程数量。
如果pm设置为staic, 那么只有pm.max_childern这个参数生效
如果pm设置为dynamic, 4个参数都生效。系统会在php-fpm运行开始时启动pm.start_servers个php-fpm进程, 然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。

PS: 要求pm.start_servers的值在pm.min_spare_servers和pm.max_spare_servers之间

启动:

/usr/local/php/sbin/php-fpm

#手动打补丁的启动方式
/usr/local/php/sbin/php-fpm start

# php-fpm 关闭: 
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

# php-fpm 重启: 
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

# 查看php-fpm进程数: 
ps aux | grep -c php-fpm

2.2 查看php-fpm的status

首先设置php-fpm :

pm.status_path = /status # 路径随你自己配置

# 然后配置nginx
location /php_fpm_status {
    allow 127.0.0.1;
    #deny all;
    fastcgi_pass unix:/tmp/php7-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    include fastcgi_params;
}

# 重启php-fpm和nginx就行了
curl localhost/php_fpm_status

配置完成之后就可以通过curl访问了, 一般来说我们只要将设置的比最大进程数大一点就行了
php-fpm status字段的含义:

字段 含义
pool php-fpm pool的名称, 大多数情况下为www
process manager 进程管理方式, 现今大多都为dynamic, 不要使用static
start time php-fpm上次启动的时间
start since php-fpm已运行了多少秒
accepted conn pool接收到的请求数
listen queue 处于等待状态中的连接数, 如果不为0, 需要增加php-fpm进程数
max listen queue 从php-fpm启动到现在处于等待连接的最大数量
listen queue len 处于等待连接队列的套接字大小
idle processes 处于空闲状态的进程数
active processes 处于活动状态的进程数
total processess 进程总数
max active process 从php-fpm启动到现在最多有几个进程处于活动状态
max children reached 当pm试图启动更多的children进程时, 却达到了进程数的限制, 达到一次记录一次, 如果不为0, 需要增加php-fpm pool进程的最大数
slow requests 当启用了php-fpm slow-log功能时, 如果出现php-fpm慢请求这个计数器会增加, 一般不当的Mysql查询会触发这个值

3. Composer 的使用

Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库, 它会在你的项目中为你安装他们。
Composer 不是一个包管理器。是的, 它涉及 “packages” 和 “libraries”, 但它在每个项目的基础上进行管理, 在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此, 这仅仅是一个依赖管理。

3.1 安装 Composer

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer    #将composer.phar文件移动到bin目录以便全局使用composer命令

如果上述方法由于某些原因失败了, 你还可以通过 php >下载安装器:

php -r "readfile('https://getcomposer.org/installer');" | php

这将检查一些 PHP 的设置, 然后下载 composer.phar 到你的工作目录中。这是 Composer 的二进制文件。这是一个 PHAR 包(PHP 的归档), 这是 PHP 的归档格式可以帮助用户在命令行中执行一些操作。
你可以通过 –install-dir 选项指定 Composer 的安装目录(它可以是一个绝对或相对路径):

curl -sS https://getcomposer.org/installer | php -- --install-dir=bin

3.2 使用 Composer

现在我们将使用 Composer 来安装项目的依赖。如果在当前目录下没有一个 composer.json 文件, 请查看基本用法章节。
要解决和下载依赖, 请执行 install 命令:

php composer.phar install

如果你进行了全局安装, 并且没有 phar 文件在当前目录, 请使用下面的命令代替:

composer install

继续 上面的例子, 这里将下载 monolog 到 vendor/monolog/monolog 目录。

除了库的下载, Composer 还准备了一个自动加载文件, 它可以加载 Composer 下载的库中所有的类文件。使用它, 你只需要将下面这行代码添加到你项目的引导文件中:

require 'vendor/autoload.php';

现在我们就可以使用 monolog 了!想要学习更多关于 Composer 的知识, 请查看“基本用法”章节。

3.3 镜像用法

系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中

composer config -g repo.packagist composer https://packagist.phpcomposer.com
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

单个项目配置:
修改当前项目的 composer.json 配置文件:

composer config repo.packagist composer https://packagist.phpcomposer.com

上述命令将会在当前项目中的 composer.json 文件的末尾自动添加镜像的配置信息(你也可以自己手工添加):

"repositories": {
    "packagist": {
        "type": "composer",
        "url": "https://packagist.phpcomposer.com"
    }
}

3.4 常见问题汇总

3.4.1 [Composer\Exception\NoSslException]

composer config secure-http false 
composer config -g secure-http false 
composer config -g -- disable-tls true
composer config repo.packagist composer https://packagist.phpcomposer.com 
composer config -g repo.packagist composer https://packagist.phpcomposer.com