CentOS7下PHP的编译安装

说明

在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 可以看到详细介绍. 不明白具体含义的可以百度每个参数的意义.如果英文水平马马虎虎建议看官方文档. 这里主要说明几个常用的

  1. --prefix=/usr/local/php74 是指定编译后的二进制安装目录
  2. --enable-mbstring 开启多字节字符支持.在目前utf8编码大行其道的情况下多字节字符支持很重要.
  3. --enable-soap 主要是支持webservice功能
  4. --enable-gd 需要对图像进行处理可以开启此功能.
  5. --enable-sockets 底层套接字支持.
  6. --with-pdo-mysql PDO对mysql数据库的支持. 这个应该大家都会开启.
  7. --enable-fpm 开启fpm支持. nginx和php-fpm简直绝配. 关于cgi, fast-cgi, fast-cgi进程管理器那是另一个值得了解的东西.大家有兴趣请自行百度.
  • 基本刚开始几次都会提示错误, 比如缺少c编译器, 缺少lib, 缺少头文件之类的东西.

    1. 比如缺少C 编译器.
    configure: error: no acceptable C compiler found in $PATH
    

    直接装一个就好

    yum install gcc gcc-c++ -y
    
    1. 比如 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
    
    1. 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. 主要修改的地方包括运行时的用户/组, 监听地址, 允许连接的客户端地址, 控制子进程数量的模式, 访问日志, 慢日志等. 限于篇幅,具体参数的意义就不多介绍配置文件中的注释都写的比较清楚了. 大概说下几个经验之谈
    1. 作者通常会创建一个权限比较小的用户比如名为 www的用户来运行php-fpm. 站点中所有文件目录的所有者都改为www.
    2. 类似作者需要同时运行php5 和 php7的情况下, 会让php-fpm监听不用的端口来解决.
    3. 只允许特定地址的客户端连接php-fpm,比如本机127.0.0.1 或者同网段中做负载均衡的机器.这样比较安全
    4. 子进程通常采用动态模式, 根据自己的并发量来设置最大最小空闲进程数量,最大子进程数量等
    5. 记录访问日志和慢日志对于分析并发量和性能优化有很大帮助.
  • 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的安装到此就算结束了. 后面我们再介绍下各种扩展的安装方法.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容