Linux安装php8
作者QQ:67065435 QQ群:669756510
本站内容全部为作者原创,转载请注明出处!
安装准备
# CentOS yum -y --nogpgcheck \ install \ re2c \ llvm \ libwebp \ libjpeg \ libXpm \ ImageMagick \ libtool \ python27 \ curl-devel \ bzip2-devel \ libicu-devel \ libpng-devel \ libpsl-devel \ libxml2-devel \ libxslt-devel \ openssl-devel \ freetype-devel \ libicu-devel \ libuuid-devel \ libmcrypt-devel \ sqlite-devel \ postgresql-devel # mbstring依赖 yum -y --nogpgcheck install oniguruma-devel # remi yum -y --nogpgcheck install https://rpms.remirepo.net/enterprise/remi-release-7.rpm # libzip5 yum --enablerepo=remi install libzip5 -y安装openssl
cd /root wget --no-check-certificate -c https://github.com/openssl/openssl/releases/download/OpenSSL_1_0_2u/openssl-1.1.1u.tar.gz cd openssl-1.1.1u ./config --prefix=/usr make -j$(nproc) make -j$(nproc) install安装libxml2
cd /root wget --no-check-certificate -c https://download.gnome.org/sources/libxml2/2.13/libxml2-2.13.6.tar.xz tar -xf libxml2-2.13.6.tar.xz cd libxml2-2.13.6 PKG_CONFIG_PATH=/opt/rh/python27/root/usr/lib64/pkgconfig ./configure make -j$(nproc) make -j$(nproc) install-
cd /root wget --no-check-certificate -c https://www.php.net/distributions/php-8.4.4.tar.gz tar -xf php-8.4.4.tar.gz cd php-8.4.4 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig \ ./configure \ --prefix=/usr/local/php8 \ --with-openssl \ --enable-mysqlnd \ --enable-sockets \ --enable-fpm # 如果在/usr/local/apache/路径下安装了apache并且想让php运行在apache下,需要加上: # --with-apxs2=/usr/local/apache/bin/apxs # 或 --with-apxs2=/usr/local/apache/bin/apxs2 # apxs在有些apache发行版中已经改名为apxs2 make -j$(nproc) make -j$(nproc) 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 生成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.confphp.ini常规配置
# 下载cacert.pem cd /usr/local/php8/lib wget --no-check-certificate -c https://curl.haxx.se/ca/cacert.pem vim /usr/local/php8/lib/php.ini ;文件上传设置 file_uploads=On post_max_size=210M upload_max_filesize=200M max_execution_time=0 max_file_uploads=20 max_input_time=600 ;php版本信息隐藏 expose_php=Off ;防止显示php错误输出,Off: 不输出但存入日志 display_errors=Off ;防止用户将可执行文件伪装成静态文件(如图片、文档)上传后,通过访问WEB页面执行该文件 cgi.fix_pathinfo=0 ;session.name如果自己开发程序可以改,但如果是部署已有项目,修改后可能导致session相关功能异常 session.name=self_key ;每请求10次session的key,检查1次key是否需要过期删除 session.gc_probability=1 session.gc_divisor=1000 ;设置session默认1天过期 session.gc_maxlifetime=86400 ;时区中国上海 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配置php-fpm.conf
vim /usr/local/php8/etc/php-fpm.conf pid=run/php-fpm.pid error_log=log/php-fpm.log log_level=error # 如开启该配置↓,下一步不可跳过 rlimit_files=65535 ESC :wq调整最大文件打开数(数值仅供参考,如上一步骤未配置rlimit_files,本步可跳过)
# 在文件末尾添加 vim /etc/security/limits.conf * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535 ESC :wq配置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 # 动态分配子进程(内存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 slowlog=log/$pool.log.slow ESC :wq将php加入环境变量
vim /etc/profile export PATH=$PATH:/usr/local/php8/bin export PATH=$PATH:/usr/local/php8/sbin ESC :wq source /etc/profile安装pecl(先处理php环境变量)
# 需要先安装mbstring扩展 # 如果存在pecl则无需执行 cd /root wget --no-check-certificate -c http://pear.php.net/go-pear.phar php go-pear.phar rm go-pear.phar安装composer(先安装zlib扩展)
# 安装zlib扩展 cd ~ wget zlib-1.2.11.tar.gz tar -xf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure --prefix=/usr/local/zlib make make install find /usr/local/zlib -type f -name '*pc' export PKG_CONFIG_PATH=/usr/local/zlib/lib/pkgconfig cd php-8.4.4/ext/zlib phpize ./configure make make install 修改php.ini # 下载(需要先安装zlib扩展) cd /usr/local/php8/bin wget --no-check-certificate -c https://getcomposer.org/installer /usr/local/php8/bin/php installer rm installer mv ./composer.phar ./composer composer -V composer self-update 2.2.9composer全局换源
# 禁用默认源 composer config -g secure-http false # 切到阿里源 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ # 查看当前源 composer config -g -l安装phpunit官方下载
cd /usr/local/php8/bin wget --no-check-certificate -c https://phar.phpunit.de/phpunit-9.5.0.phar mv phpunit-9.5.0.phar phpunit chmod -R 755 phpunit phpunit --version启动php并设置开机启动
# 添加www用户 useradd www mkdir /www chown -R www:www /www chown -R www:www /usr/local/php8 # 进入单元文件目录 vim /etc/systemd/system/php8.service [Unit] Description=PHP8 After=default.target network.target [Service] User=root Group=root Type=forking PIDFile=/usr/local/php8/var/run/php-fpm.pid ExecStart=/usr/local/php8/sbin/php-fpm ExecReload=/bin/kill -USR2 $MAINPID ExecStop=/bin/kill -QUIT $MAINPID PrivateTmp=true Restart=always RestartSec=0 StartLimitInterval=0 [Install] WantedBy=multi-user.target ESC :wq # 更新systemd systemctl daemon-reload systemctl enable php8 systemctl start php8查看运行情况
# 查看主进程、子进程 ps aux | grep php-fpm # 查看pid文件(存在即成功) ll /usr/local/php8/var/run/php进程操作
# 平滑关闭 kill -INT `cat /usr/local/php8/var/run/php-fpm.pid` # 平滑重启 kill -USR2 `cat /usr/local/php8/var/run/php-fpm.pid`安装php扩展
# 进入目录 cd /root/php-8.4.4/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 -j$(nproc) make -j$(nproc) install # 安装GD库 # 安装准备 yum -y --nogpgcheck \ install \ libXpm-devel \ libpng-devel \ libjpeg-devel \ libwebp-devel \ freetype-devel # 进入目录 cd /root/php-8.4.4/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 -j$(nproc) make -j$(nproc) install # 安装curl # 进入目录 cd /root/php-8.4.4/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 -j$(nproc) make -j$(nproc) install # 加入扩展 vim /usr/local/php8/lib/php.ini extension=xxxx.so ESC :wq # 安装opcache # 进入目录 cd /root/php-8.4.4/ext/opcache # 初始扩展 /usr/local/php8/bin/phpize # 声明配置 ./configure --with-php-config=/usr/local/php8/bin/php-config # 编译安装 make -j$(nproc) make -j$(nproc) 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=0 opcache.revalidate_freq=60 # php7.2.0移除↓ opcache.fast_shutdown=1 # php8新增↓ opcache.jit=1205 opcache.jit_buffer_size=100M ESC :wq # 相关说明 # opcache.revalidate_freq=60 每过60秒检查代码更新 # opcache.validate_timestamps=0 为1表示revalidate_freq有效,为0永远不更新代码常用扩展('-'表示可能已经安装的扩展,安装前检查已安装扩展,防止重复安装)
bcmath - ctype curl - date - fileinfo gd - hash - iconv intl - json mbstring mcrypt - mysqlnd - openssl - pcre - PDO pdo_mysql pdo_pgsql sockets zip zlib rdkafka(wget --no-check-certificate -c https://pecl.php.net/get/rdkafka-6.0.5.tgz) redis (wget --no-check-certificate -c http://pecl.php.net/get/redis-5.3.7.tgz) mongodb (wget --no-check-certificate -c http://pecl.php.net/get/mongodb-1.6.0.tgz)ZendOpcache的最佳设置官方链接
ZendOpcache的最佳设置参数介绍
ZendOpcache的最佳设置参数实践
ZendOpcache的安装文档参数实践
题外话
PHP线程安全
Thread Safe(线程安全) 与 Non Thread Safe(非线程安全)区别: Thread Safe是线程安全,执行时会进行线程安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源。 Non Thread Safe是非线程安全,执行时不进行线程安全检查,因为在有些WebServer中,PHP的执行方式是ISAPI(见下文介绍)。PHP执行方式
ISAPI(动态库调用) 与 FastCGI(快速公共网关接口)区别: ISAPI执行方式是以dll(windows)或so(linux)动态库调用,用户请求时执行,用户请求后线程不马上消失,所以需要进行线程安全检查提高程序执行效率,所以ISAPI执行PHP应当选择【线程安全】版本。 FastCGI执行方式是以【单一线程】来执行操作,除去【线程安全检查】可以【提高执行效率】,所以FastCGI执行PHP应当选择【非线程安全】版本。 ISAPI(动态库调用) 与 FastCGI(快速公共网关接口)联系: ISAPI(动态库调用) 与 FastCGI(快速公共网关接口)都无需在PHP中设置,是通过webserver来进行操作。