CentOS7安装php8

  1. 作者QQ:67065435 QQ群:821635552

  2. 本站内容全部为作者原创,转载请注明出处!

  3. 安装准备

    # CentOS
    yum install \
    vim \
    gcc \
    gcc-c++ \
    wget \
    make \
    re2c \
    llvm \
    libtool \
    automake \
    autoconf \
    curl-devel \
    bzip2-devel \
    libpng-devel \
    libxml2-devel \
    libxslt-devel \
    openssl-devel \
    freetype-devel \
    libicu-devel \
    libuuid-devel \
    libmcrypt-devel \
    sqlite-devel \
    postgresql-devel \
    -y
    
  4. 安装php

    cd /root
    wget https://www.php.net/distributions/php-8.0.0.tar.gz
    tar -zxvf php-8.0.0.tar.gz
    cd php-8.0.0
    ./configure \
    --prefix=/usr/local/php8 \
    --with-openssl \
    --enable-mysqlnd \
    --enable-fpm
    
    # 如果想通过系统生成systemd文件管理php-fpm
    # yum install systemd-devel
    # sudo apt-get install libsystemd0
    # --with-fpm-systemd
    
    # 如果在/usr/local/apache/路径下安装了apache并且想让php运行在apache下,需要加上:
    # --with-apxs2=/usr/local/apache/bin/apxs
    # 或 --with-apxs2=/usr/local/apache/bin/apxs2
    # apxs在有些apache发行版中已经改名为apxs2
    
    make
    make install
    
    # 如果在/usr/local/apache/路径下安装了apache并且想让php运行在apache下,apache不需要重新编译
    # 这时候/usr/local/apache/modules/下多了一个libphp8.so文件
    # 编辑/etc/httpd/httpd.conf添加如下行:
    
    LoadModule php8_module modules/libphp8.so
    DocumentRoot "/www"
    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>
    
    # 编辑/www/index.php添加如下行:
    
    <?php
    phpinfo();
    
    # 重启apache
    # 访问http://xxx.xxx.xxx.xxx/index.php
    
  5. 生成php.ini、php-fpm.conf、www.conf

    # 检查php.ini是否正确放置(只需要第一行不为none)
    /usr/local/php8/bin/php --ini
    
    部署环境执行:
    cp ./php.ini-production /usr/local/php8/lib/php.ini
    
    开发环境执行:
    cp ./php.ini-development /usr/local/php8/lib/php.ini
    
    # 拷贝php-fpm.conf
    cp /usr/local/php8/etc/php-fpm.conf.default /usr/local/php8/etc/php-fpm.conf
    
    # php8才执行(PHP5中,www.conf的配置项在php-fpm.conf)
    cp /usr/local/php8/etc/php-fpm.d/www.conf.default /usr/local/php8/etc/php-fpm.d/www.conf
    
  6. cacert.pem

  7. php.ini常规配置

    # 下载cacert.pem
    cd /usr/local/php8/lib
    wget https://curl.haxx.se/ca/cacert.pem
    
    vim /usr/local/php8/lib/php.ini
    
    ;php版本信息隐藏
    expose_php=Off
    
    ;防止显示php错误输出,Off: 不输出但存入日志
    display_errors=Off
    
    ;防止用户将可执行文件伪装成静态文件(如图片、文档)上传后,通过访问WEB页面执行该文件
    cgi.fix_pathinfo=0
    
    ;允许上传单个文件最大20M
    upload_max_filesize=20M
    
    ;设置响应超时时间为20秒
    max_execution_time=20
    
    ;session.name如果自己开发程序可以改,但如果是部署已有项目,修改后可能导致session相关功能异常
    session.name=self_key
    
    ;每请求10次session的key,检查1次key是否需要过期删除
    session.gc_probability=1
    session.gc_divisor=1000
    
    ;设置session默认5分钟(300秒)过期
    session.gc_maxlifetime=1440
    
    ;时区中国上海
    date.timezone=Asia/Shanghai
    
    ;curl、openssl配置cacert.pem
    curl.cainfo=/usr/local/php8/lib/cacert.pem
    openssl.cafile=/usr/local/php8/lib/cacert.pem
    
    ESC
    :wq
    
  8. 配置php-fpm.conf

    vim /usr/local/php8/etc/php-fpm.conf
    
    pid=run/php-fpm.pid
    error_log=log/php-fpm.log
    # 如开启该配置↓,下一步不可跳过
    rlimit_files=51200
    
    ESC
    :wq
    
  9. 调整最大文件打开数(数值仅供参考,如上一步骤未配置rlimit_files,本步可跳过)

    # 在文件末尾添加
    vim /etc/security/limits.conf
    
    * soft nproc 1024000
    * hard nproc 1024000
    * soft nofile 1024000
    * hard nofile 1024000
    
    ESC
    :wq
    
  10. 配置www.conf

    vim /usr/local/php8/etc/php-fpm.d/www.conf
    
    user=www
    group=www
    
    # 静态分配子进程(内存1G,计划为php分配 640M 内存)
    pm=static
    pm.max_children=20
    pm.start_servers=15
    pm.min_spare_servers=10
    pm.max_spare_servers=20
    pm.process_idle_timeout=10s
    pm.max_requests=500
    request_terminate_timeout = 20
    slowlog=log/$pool.log.slow
    php_admin_value[memory_limit]=32M
    
    # 动态分配子进程(内存1G,计划为php分配 640M 内存)
    pm=dynamic
    pm.max_children=20
    pm.start_servers=15
    pm.min_spare_servers=10
    pm.max_spare_servers=20
    pm.process_idle_timeout=10s
    pm.max_requests=500
    request_terminate_timeout = 20
    slowlog=log/$pool.log.slow
    php_admin_value[memory_limit]=32M
    
    ESC
    :wq
    
  11. 将php加入环境变量

    vim /etc/profile
    
    export PATH=$PATH:/usr/local/php8/bin
    export PATH=$PATH:/usr/local/php8/sbin
    
    ESC
    :wq
    
    source /etc/profile
    
  12. 安装composer(先安装zlib扩展)

    # 下载(需要先安装zlib扩展)
    cd /usr/local/php8/bin
    curl -sS https://getcomposer.org/installer | /usr/local/php8/bin/php
    mv ./composer.phar ./composer
    composer -V
    
  13. composer全局换源

    # 禁用默认源
    composer config -g secure-http false
    # 切到阿里源
    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
    # 查看当前源
    composer config -g -l
    
  14. 启动php并设置开机启动

    # 添加www用户
    useradd www
    mkdir /www
    chown -R www:www /www
    chown -R www:www /usr/local/php8
    
    # 进入单元文件目录
    cd /etc/systemd/system
    vim php8.service
    
    [Unit]
    Description=Start php8 on boot.
    After=default.target network.target
    
    [Service]
    User=root
    Group=root
    Type=forking
    ExecStart=/usr/local/php8/sbin/php-fpm
    ExecReload=/bin/kill -USR2 `cat /usr/local/php8/var/run/php-fpm.pid`
    ExecStop=/bin/kill -INT `cat /usr/local/php8/var/run/php-fpm.pid`
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    
    ESC
    :wq
    
    # 更新systemd
    systemctl daemon-reload
    systemctl enable php8
    systemctl start php8
    
  15. 查看运行情况

    # 查看主进程、子进程
    ps aux | grep php-fpm
    
    # 查看pid文件(存在即成功)
    ll /usr/local/php8/var/run/
    
  16. php进程操作

    # 平滑关闭
    kill -INT `cat /usr/local/php8/var/run/php-fpm.pid`
    # 平滑重启
    kill -USR2 `cat /usr/local/php8/var/run/php-fpm.pid`
    
  17. 安装php扩展

    # 进入目录
    cd /root/php-8.0.0/ext/xxxx
    
    # 如果缺少config.m4则执行
    cp ./config0.m4 ./config.m4
    
    # 初始化扩展
    /usr/local/php8/bin/phpize
    
    # 声明配置
    ./configure --with-php-config=/usr/local/php8/bin/php-config
    
    # 编译安装
    make
    make install
    
    # 安装GD库
    # 安装准备
    yum install \
    libXpm-devel \
    libpng-devel \
    libjpeg-devel \
    libwebp-devel \
    -y
    
    # 进入目录
    cd /root/php-8.0.0/ext/gd
    
    # 初始扩展
    /usr/local/php8/bin/phpize
    
    # 声明配置
    ./configure --with-php-config=/usr/local/php8/bin/php-config \
    --with-xpm \
    --with-jpeg \
    --with-webp \
    --with-freetype
    
    # 编译安装
    make
    make install
    
    # 安装curl
    # 进入目录
    cd /root/php-8.0.0/ext/curl
    
    # 初始扩展
    /usr/local/php8/bin/phpize
    
    # 声明配置
    ./configure --with-php-config=/usr/local/php8/bin/php-config
    
    # 修改文件
    vim multi.c
    
    # 将575行左右
    for (zval *pz_ch = (zval *) zend_llist_get_first_ex(&curl_multi->easyh, &pos); pz_ch;
            pz_ch = (zval *) zend_llist_get_next_ex(&curl_multi->easyh, &pos)) {
            zend_get_gc_buffer_add_zval(gc_buffer, pz_ch);
    }
    # 改为
    zval *pz_ch = (zval *) zend_llist_get_first_ex(&curl_multi->easyh, &pos);
    for (true; pz_ch;
            pz_ch = (zval *) zend_llist_get_next_ex(&curl_multi->easyh, &pos)) {
            zend_get_gc_buffer_add_zval(gc_buffer, pz_ch);
    }
    
    # 编译安装
    make
    make install
    
    # 加入扩展
    vim /usr/local/php8/lib/php.ini
    
    extension=xxxx.so
    
    ESC
    :wq
    
    # 安装opcache
    # 进入目录
    cd /root/php-8.0.0/ext/opcache
    
    # 初始扩展
    /usr/local/php8/bin/phpize
    
    # 声明配置
    ./configure --with-php-config=/usr/local/php8/bin/php-config
    
    # 编译安装
    make
    make install
    
    # 加入扩展
    vim /usr/local/php8/lib/php.ini
    
    zend_extension=opcache.so
    opcache.enable_cli=1
    opcache.memory_consumption=256
    opcache.interned_strings_buffer=16
    opcache.max_accelerated_files=32531
    opcache.validate_timestamps=1
    opcache.revalidate_freq=60
    # php7.2.0移除↓
    opcache.fast_shutdown=1
    
    ESC
    :wq
    
    # 相关说明
    # opcache.revalidate_freq=60    每过60秒检查代码更新
    # opcache.validate_timestamps=1 为1表示revalidate_freq有效,为0永远不更新代码
    
  18. 常用扩展('-'表示可能已经安装的扩展,安装前检查已安装扩展,防止重复安装)

    bcmath
    - ctype
    curl
    - date
    - fileinfo
    gd
    - hash
    - iconv
    intl
    - json
    mbstring
    mcrypt
    - mysqlnd
    - openssl
    - pcre
    - PDO
    pdo_mysql
    pdo_pgsql
    sockets
    zip
    zlib
    
    gearman (wget https://github.com/wcgallego/pecl-gearman/archive/gearman-2.0.3.tar.gz)
    
    libzookeeper (wget https://github.com/Timandes/libzookeeper/archive/v0.7.2.tar.gz)
    zookeeper (wget https://pecl.php.net/get/zookeeper-0.4.0.tgz)
    
    mongodb (wget http://pecl.php.net/get/mongodb-1.6.0.tgz)
    
    redis (wget http://pecl.php.net/get/redis-3.1.2.tgz)
    
    uuid (wget http://pecl.php.net/get/uuid-1.0.4.tgz)
    
  19. ZendOpcache的最佳设置官方链接

  20. ZendOpcache的最佳设置参数介绍

  21. ZendOpcache的最佳设置参数实践

  22. ZendOpcache的安装文档参数实践

题外话

  1. PHP线程安全

    Thread Safe(线程安全) 与 Non Thread Safe(非线程安全)区别:
    Thread Safe是线程安全,执行时会进行线程安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。
    Non Thread Safe是非线程安全,执行时不进行线程安全检查,因为在有些WebServer中,PHP的执行方式是ISAPI(见下文介绍)。
    
  2. PHP执行方式

    ISAPI(动态库调用) 与 FastCGI(快速公共网关接口)区别:
    ISAPI执行方式是以dll(windows)或so(linux)动态库调用,用户请求时执行,用户请求后线程不马上消失,所以需要进行线程安全检查提高程序执行效率,所以ISAPI执行PHP应当选择【线程安全】版本。
    FastCGI执行方式是以【单一线程】来执行操作,除去【线程安全检查】可以【提高执行效率】,所以FastCGI执行PHP应当选择【非线程安全】版本。
    
    ISAPI(动态库调用) 与 FastCGI(快速公共网关接口)联系:
    ISAPI(动态库调用) 与 FastCGI(快速公共网关接口)都无需在PHP中设置,是通过webserver来进行操作。
    
Copyright © 豆包嘿嘿~ 2012-∞ 冀ICP备17033181号 all right reserved,powered by Gitbook修订: 2020-11-09 06:49:56

results matching ""

    No results matching ""