说明
在windows平台上直接执行下载的安装包一路点击下一步很容易安装这里不多介绍.由于作者大多数情况都是在CentOS环境中安装相关软件, 故此做CentOS 7下做相关介绍. ubuntu或者其他linux发行版下的操作大同小异.
linux下可以选择包安装也可以选择源码自己编译安装. 包安装的话,通常在CentOS的yum源里面已经有打好的包直接yum安装就可以.命令如下(非root请加sudo)
yum install php -y
不过此版本比较陈旧,基本不是首选.那要想通过包安装比较新版本的php怎么办呢?还好有个 webtatic 他会打包比较新的php版本.要使用这种方式的话得先添加epel 和 webtatic的源.百度上也有很多教程.命令如下:
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install php70w
基本上通过webtatic源来安装也够用.但是他的版本还是略微滞后了些, 另一方面作者喜欢更精细的控制所以通常会采用源码编译安装,下面就着重说下源码安装的方式
源码安装
首先得下载源码.直接在官网上找最新释放出来的版本下载就好.上面会列出当前几个并行次级版本的稳定版本,比如 7.4.x, 7.3.x, 7.2.x.此处选择当前的最新版本7.4.4为例.
- 下载源码
cd /usr/local/src/
wget https://www.php.net/distributions/php-7.4.4.tar.gz
- 解压
tar -zxvf php-7.4.4.tar.gz
- 配置. 通常根据自己需要来配置模块,安装位置,功能开关等.比如作者通常喜欢将代码放在 /usr/local/src/ 目录下, 将编译后的二进制程序放在/usr/local/php74/ 目录下.
cd php-7.4.4
./configure --prefix=/usr/local/php74 --with-pdo-pgsql --with-zlib-dir --with-freetype --enable-mbstring --enable-soap --enable-calendar --with-curl --enable-gd --with-webp --with-jpeg --with-xpm --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --with-zip --with-pcre-jit --with-pdo-mysql --with-mysqli --with-openssl --with-fpm-user=www --with-fpm-group=www --enable-ftp --with-gettext --with-xmlrpc --with-xsl --enable-opcache --enable-fpm --with-iconv --with-pear
具体配置参数的意义用 ./configure -h 可以看到详细介绍. 不明白具体含义的可以百度每个参数的意义.如果英文水平马马虎虎建议看官方文档. 这里主要说明几个常用的
- --prefix=/usr/local/php74 是指定编译后的二进制安装目录
- --enable-mbstring 开启多字节字符支持.在目前utf8编码大行其道的情况下多字节字符支持很重要.
- --enable-soap 主要是支持webservice功能
- --enable-gd 需要对图像进行处理可以开启此功能.
- --enable-sockets 底层套接字支持.
- --with-pdo-mysql PDO对mysql数据库的支持. 这个应该大家都会开启.
- --enable-fpm 开启fpm支持. nginx和php-fpm简直绝配. 关于cgi, fast-cgi, fast-cgi进程管理器那是另一个值得了解的东西.大家有兴趣请自行百度.
-
基本刚开始几次都会提示错误, 比如缺少c编译器, 缺少lib, 缺少头文件之类的东西.
- 比如缺少C 编译器.
configure: error: no acceptable C compiler found in $PATH
直接装一个就好
yum install gcc gcc-c++ -y
- 比如 No package 'libxml-2.0' found. 安装相应类库和头就好. 大部分情况下安装 libxxx 和 libxxx-devel就能解决
yum install libxml2 libxml2-devel libXpm-devel libpng-devel libjpeg-devel libwebp-devel libcurl-devel libbzip2-devel sqlite-devel openssl-devel freetype-devel oniguruma oniguruma-devel postgresql-devel libxslt-devel
- libzip 这个比较特殊麻烦点,要求版本 >= 0.11. 然而yum源安装的是0.10的, 得自己下载源码编译安装这个库.然后下载的libzip-1.6.1版本的需要cmkae, yum安装cmake之后又发现libzip-1.6.1要求cmake 3.0.2或者更高版本才可以,而yum源安装的是2.8版本的.这个真的是一环套一环啊.那先装cmake吧
cd /usr/local/src/ wget https://github.com/Kitware/CMake/releases/download/v3.17.0/cmake-3.17.0.tar.gz tar -zxvf cmake-3.17.0.tar.gz cd cmake-3.17.0 ./configure gmake make install ln -s /usr/local/bin/cmake /usr/bin/cmake
再安装libzip
cd /usr/local/src/ wget https://libzip.org/download/libzip-1.6.1.tar.gz tar -zxvf libzip-1.6.1.tar.gz cd libzip-1.6.1 mkdir build cd build cmake .. make && make install ln -s /usr/local/lib64/libzip.so /usr/lib64/libzip.so ln -s /usr/local/lib64/libzip.so.5 /usr/lib64/libzip.so.5 export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig/
最后继续php的编译
cd /usr/local/src/ cd php-7.4.4 ./configure --prefix=/usr/local/php74 --with-pdo-pgsql --with-zlib-dir --with-freetype --enable-mbstring --enable-soap --enable-calendar --with-curl --enable-gd --with-webp --with-jpeg --with-xpm --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --with-zip --with-pcre-jit --with-pdo-mysql --with-mysqli --with-openssl --with-fpm-user=www --with-fpm-group=www --enable-ftp --with-gettext --with-xmlrpc --with-xsl --enable-opcache --enable-fpm --with-iconv --with-pear make && make install
最后执行下面指令(具体目录以你编译时参数 --prefix来确定)
/usr/loccal/php74/bin/php -v
能看到正确的php版本信息就说明我们编译安装成功了. 如果想要shell里面能直接执行php 通常可以考虑将php所在目录加入到PATH环境变量.但是作者通常会装多个版本的php在系统中,所以作者更喜欢在 /usr/bin/ 目录下面做链接.
ln -s /usr/local/php74/bin/php /usr/bin/php
然后就可以直接在shell中执行 php了.
配置文件
接下来就是配置php.ini以及php-fpm了.
首先我们看下php在哪里加载配置文件
php -i | grep ini
输出结果如下:
Configuration File (php.ini) Path => /usr/local/php74/lib
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)
user_ini.cache_ttl => 300 => 300
user_ini.filename => .user.ini => .user.ini
可以看到php默认是在/usr/local/php74/lib 目录下寻找php.ini配置文件. 那我们将源码中的配置文件复制一份过去就好
cp /usr/local/src/php-7.4.4/php.ini-production /usr/local/php74/lib/php.ini
php -i | grep ini
输出结果可以看到此时php已经正确加载了php.ini配置文件.基本保持默认配置就行,需要修改的话参考官方文档来看具体参数的意义.
Configuration File (php.ini) Path => /usr/local/php74/lib
Loaded Configuration File => /usr/local/php74/lib/php.ini
PHP-FPM
相信很多人都知道互联网平台上nginx + php-fpm的经典搭配. 按照上文的编译参数来编译的话,php-fpm的二进制文件就位于/usr/local/php74/sbin/php-fpm, 在/usr/local/php74/etc/ 目录下有个php-fpm.conf.default文件 将其复制一份命名为 php-fpm.conf 作为php-fpm的主配置文件. /usr/local/php74/etc/php-fpm.d/ 目录下面有个 www.conf.default 也复制一份为 www.conf文件.此文件为进程池配置. 大部分时候一个进程池就足够用, 也有人喜欢配置多个进程池, 这个就看实际需要和个人喜好了.
cd /usr/local/php74/etc/
cp php-fpm.conf.default php-fpm.conf
cp php-fpm.d/www.conf.default php-fpm.d/www.conf
- 主配置
在主配置文件 php-fpm.conf中主要配置pid文件位置, 日志文件位置.作者通常喜欢把各种服务的pid文件放在/var/run/ 目录下统一管理.所以修改php-fpm.conf 中 pid = /var/run/php-fpm.pid - 进程池配置
配置文件 /usr/local/php74/etc/php-fpm.d/www.conf. 主要修改的地方包括运行时的用户/组, 监听地址, 允许连接的客户端地址, 控制子进程数量的模式, 访问日志, 慢日志等. 限于篇幅,具体参数的意义就不多介绍配置文件中的注释都写的比较清楚了. 大概说下几个经验之谈- 作者通常会创建一个权限比较小的用户比如名为 www的用户来运行php-fpm. 站点中所有文件目录的所有者都改为www.
- 类似作者需要同时运行php5 和 php7的情况下, 会让php-fpm监听不用的端口来解决.
- 只允许特定地址的客户端连接php-fpm,比如本机127.0.0.1 或者同网段中做负载均衡的机器.这样比较安全
- 子进程通常采用动态模式, 根据自己的并发量来设置最大最小空闲进程数量,最大子进程数量等
- 记录访问日志和慢日志对于分析并发量和性能优化有很大帮助.
- systemctl管理
centos采用systemd来代替旧的init管理各种服务. 我需要自己写一个service脚本来管理php-fpm的启动停止等.先确保建立了专用用户(作者习惯用www)
useradd www
然后用vim打开/usr/lib/systemd/system/php-fpm.service ,输入以下配置.保存退出(关于vim的使用和systemd使用那又是很大一块内容,感兴趣请自行百度)
[Unit]
Description=php-fpm
After=syslog.target network.target
[Service]
Type=forking
PIDFile=/var/run/php-fpm.pid
ExecStart=/usr/local/php74/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -INT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后尝试启动php-fpm.
systemctl start php-fpm
没报错的话再看下服务状态
systemctl status php-fpm
如果输出中有显示 Active: active (running) 那就说明启动成功.
然后设置为开机自启动
systemctl enable php-fpm
基本上PHP的安装到此就算结束了. 后面我们再介绍下各种扩展的安装方法.