PHP7.3.5编译

源码包都放在/usr/local/src/下。安装目录均在/usr/local/下。

  1. 解压tar包&安装依赖包

    cd /usr/local/src/
    tar -xf php-7.3.5.tar.gz -C /usr/local/
    tar -xf libzip-1.5.2.tar.gz -C /usr/local/
    tar -xf cmake-3.14.4.tar.gz -C /usr/local/
    #CentOS6 去掉systemd-devel
    #CentOS7中之所以安装systemd-devel是为了规避报错:系统不支持systemd
    yum install -y gcc libxml2-devel openssl-devel  curl-devel libwebp-devel libjpeg-devel libpng-devel libXpm-devel freetype-devel systemd-devel
    
  2. 编译安装选项:

    #CentOS6不要加--with-fpm-systemd选项
    cd /usr/local/php-7.3.5/
    ./configure \
    --with-libdir=/lib64 \
    --with-config-file-path=/usr/local/etc/php \
    --with-config-file-scan-dir=/usr/local/etc/php/conf.d \
    --enable-cli \
    --disable-cgi \
    --enable-fpm \
    --with-fpm-systemd \
    --with-fpm-user=nginx \
    --with-fpm-group=nginx \
    --enable-phar \
    --with-pear  \
    --disable-all \
    --enable-pdo  \
    --enable-mysqlnd \
    --with-mysqli=mysqlnd \
    --with-pdo-mysql=mysqlnd \
    --with-mysql-sock=/var/lib/mysql/mysql.sock \
    --enable-hash \
    --enable-zip \
    --with-zlib \
    --with-zlib-dir \
    --with-pcre-jit \
    --with-pcre-regex \
    --with-iconv \
    --enable-ctype \
    --enable-json  \
    --enable-session \
    --enable-xml \
    --enable-libxml \
    --enable-simplexml \
    --enable-mbstring \
    --with-curl \
    --enable-fileinfo \
    --with-openssl \
    --with-gd \
    --with-webp-dir  \
    --with-jpeg-dir \
    --with-png-dir \
    --with-xpm-dir  \
    --with-freetype-dir \
    
    make 
    make install
    
  3. 关于libzip的安装:
    CentOS7自带的libzip版本太低。
    去官网下载最新版。使用Cmake编译。

    编译安装Cmake:

    cd /usr/local/cmake-3.14.4/
    ./bootstrap
    make 
    make install
    

    编译安装libzip:

    cd /usr/local/libzip-1.5.2/
    mkdir build
    cd build
    cmake ..
    make 
    make install
    
  4. 环境配置

    #安装完成后,
    #php --ini
    #Configuration File (php.ini) Path: /usr/local/lib
    #Loaded Configuration File:         (none)
    #Scan for additional .ini files in: (none)
    #Additional .ini files parsed:      (none)
    #复制PHP配置文件
    cp /usr/local/php-7.3.5/php.ini-production /usr/local/lib/php.ini
    #vim /usr/local/lib/php.ini
    date.timezone = Asia/Shanghai
    #关于日志的说明:
    #如果在php.ini中没有定义error_log,PHP默认为空,
    #则会将错误日志写到Nginx中的error_log配置项指定的日志中
    #如果是`error_log = syslog`,会将日志写在/var/log/messages中
    #还是自己给出绝对路径吧。
    #有了php.ini中error_log,就不会把错误信息写进Nginx中的error_log指定文件了
    #如果没有事先创建目录,即使定义了这个选项,
    #还是不会写日志
    mkdir /var/log/php
    chown nginx. /var/log/php
    error_log = /var/log/php/php_errror.log
    #防止arbitrarily script injection
    cgi.fix_pathinfo=0
    #HTTP X-Powered-By头中不暴露php版本
    expose_php = Off
    
    #如何看出php-fpm的配置文件应该放在哪里?
    #php-fpm
    #ERROR: failed to open configuration file '/usr/local/etc/php-fpm.conf': No such file or directory (2)
    #ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf'
    #ERROR: FPM initialization failed
    #得出,php-fpm默认的配置文件路径为/usr/local/etc/php-fpm.conf
    #find / -type f -name  php-fpm.conf*
    #/usr/local/etc/php-fpm.conf.default
    #/usr/local/php-7.3.5/sapi/fpm/php-fpm.conf.in
    #/usr/local/php-7.3.5/sapi/fpm/php-fpm.conf
    #这几个文件基本都一样
    #使用/usr/local/etc/php-fpm.conf.default
    cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
    #vim /usr/local/etc/php-fpm.conf
    pid = run/php-fpm.pid
    error_log = /var/log/php/php-fpm_error.log
    include=etc/php-fpm.d/*.conf
    #然后
    #php-fpm
    #WARNING: Nothing matches the include pattern '/usr/local/etc/php-fpm.d/*.conf' from /usr/local/etc/php-fpm.conf at line 143.
    #ERROR: No pool defined. at least one pool section must be specified in config file
    #ERROR: failed to post process the configuration
    #ERROR: FPM initialization failed
    cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf 
    #如果提示不存在nginx这个用户,
    useradd -rs /bin/false nginx
    
  5. php-fpm启动配置

    如果在编译时添加了--with-fpm-systemd选项,只能选择Systemd启动方式,如果没有添加,只能选择SystemV启动方式。
    CentOS6使用SystemV方式,CentOS7使用Systemd方式

    • SystemV
    #php-fpm启动脚本复制
    cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
    #添加php-fpm服务和自启动
    chmod u+x /etc/init.d/php-fpm
    chkconfig --add php-fpm
    chkconfig php-fpm on 
    service php-fpm start/restart/status
    
    • Systemd
    cp /usr/local/php-7.3.5/sapi/fpm/php-fpm.service /usr/lib/systemd/system/
    systemctl enable php-fpm
    systemctl start php-fpm
    
    
  6. PS
    在编译PHP时,--enable-fileinfo需要较大内存,在我自己的单核1G阿里云主机上失败,提示内存不够。
    经测试得知,大约需要1300M左右内存。

    #给出临时SWAP分区
    dd if=/dev/zero of=/tmp/swapfile bs=1M count=500
    mkswap /tmp/swapfile
    swapon /tmp/swapfile
    #编译完成后,卸载临时SWAP分区
    swapoff /tmp/swapfile
    rm -f /tmp/swapfile
    
  7. 遗留问题:

    • --with-fpm-acl这个选项的作用是什么?
    • --with-pcre-jit这个选项的作用是什么?
  8. 参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。