php8.0.0安装体验和扩展介绍流程

  • 安装前的扯犊子科普工作

PHP 三大模块:

  • SAPI:接受并处理请求。
  • Zend Engine:PHP 的核心,负责分析 PHP 代码并转为 opcode,然后在 Zend VM 虚拟机上执行。
  • PHP 功能函数及扩展层:实现各种功能,例如 curl 通信、连接 MySQL 等。

PHP 中,有以下几种方式添加扩展:

  • 把扩展编译进 PHP

  • 通过 pecl 命令或 Linux 发行版自带的 yum、apt-get 等命令安装,动态加载(Linux 下是 *.so 文件,Windows 下是 *.dll 文件)

  • 用 phpize 从源码编译共享 PECL 扩展库

    相比通过 yum install 或 apt-get 等各大 Linux 发行版自带的安装方向,源码编译安装略显复杂,但是灵活性也更高,比如要安装 PCNTL 等扩展,就只能通过源码编译安装。

  • 注意:源码编译安装时,只会安装指定的扩展,而好多扩展是默认不安装的。对于常用的数据库驱动、OpenSSL、GD 库等都需要指定。如果安装后发现遗漏,可以重新编译,加上相应的参数可得到驱动程序(Linux 下是 *.so 文件),然后复制到 PHP 的扩展目录(一般是 /usr/local/php/include/php/ext)下,并在 php.ini 配置文件中开启扩展既可以。

通过 yum list php72w-* 可以在 CentOS 中查看可以使用命令安装的扩展。

  • 概述啰嗦完成,接着来干正事

安装环境

  • 1核2GB配置,建议玩家能高就高,下文就有编译过程中低配置的问题体现,仔细阅读,谨慎跳跃查看

    CentOS Linux release 7.7.1908 (Core)

    Linux VM_0_12_centos 3.10.0-1062.9.1.el7.x86_64 #1 SMP Fri Dec 6 15:49:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

0、下载地址

复制代码
wget https://github.com/php/php-src/archive/php-8.0.0.tar.gz

安装依赖

复制代码
yum install -y autoconf libxml2-dev libsqlite3-dev \
libcurl4-openssl-dev libssl-dev libonig-dev libtidy-dev zlib1g-dev

1、压缩包解压常规操作 php-src-php-8.0.0.tar.gz

复制代码
tar -zxvf php-src-php-8.0.0.tar.gz

2、从官方包中拿到的数据不含configure脚本,需要将安装GNU autoconf,来生成configure

复制代码
yum install autoconf
运行 ./buildconf
``

然后 configure就可以安装了
参考官网地址:https://www.php.net/manual/zh/faq.build.php

3、调用configure生成Makefile文件

执行配置选项(例如 --prefix 可以指定安装位置),判断硬件及操作系统平台,生成需要编译的 Makefile 文件

执行configure的前置操作

复制代码
mkdir /usr/local/php800

配置扩展参数

复制代码
./configure \
--prefix=/usr/local/php800 \
--exec-prefix=/usr/local/php800 \
--bindir=/usr/local/php800/bin \
--sbindir=/usr/local/php800/sbin \
--includedir=/usr/local/php800/include \
--libdir=/usr/local/php800/lib/php \
--mandir=/usr/local/php800/php/man \
--with-config-file-path=/usr/local/php800/etc \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-soap \
--with-libxml-dir \
--with-xmlrpc \
--with-openssl \
--with-mcrypt \
--with-mhash \
--with-pcre-regex \
--with-sqlite3 \
--with-zlib \
--enable-bcmath \
--with-iconv \
--with-bz2 \
--enable-calendar \
--with-curl \
--with-cdb \
--enable-dom \
--enable-exif \
--enable-fileinfo \
--enable-filter \
--with-pcre-dir \
--enable-ftp \
--with-gd \
--with-openssl-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--with-freetype-dir \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--with-gettext \
--with-gmp \
--with-mhash \
--enable-json \
--enable-mbstring \
--enable-mbregex \
--enable-mbregex-backtrack \
--with-libmbfl \
--with-onig \
--enable-pdo \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-zlib-dir \
--with-pdo-sqlite \
--with-readline \
--enable-session \
--enable-shmop \
--enable-simplexml \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--with-libxml-dir \
--with-xsl \
--enable-zip \
--enable-mysqlnd-compression-support \
--with-pear \
--enable-opcache \

错误清单

(1)configure: error: re2c 0.13.4 is required to generate PHP lexers.

需要安装re2c

yum安装rpm包
复制代码
yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/r/re2c-0.14.3-2.el7.x86_64.rpm
源码安装
复制代码
wget https://sourceforge.net/projects/re2c/files/0.16/re2c-0.16.tar.gz && tar zxf re2c-0.16.tar.gz && cd re2c-0.16

./configure && make && make install
安装(git源码编译)
复制代码
git clone https://git.code.sf.net/p/re2c/code-git re2c && cd re2c/
./autogen.sh && ./configure --prefix=/usr/local/re2c/
make && make install
ln -sf /usr/local/re2c/bin/re2c /usr/local/bin/re2c
re2c -v
re2c -h
git clone https://github.com/skvadrik/re2c.git re2c && cd re2c
./autogen.sh && ./configure
make && make install
(2)测试安装 php 的 openssl 模块的时候,分别使用了以下方式(以具体的openssl扩展为例)
复制代码
./configure
./configure --with-openssl
./configure --with-openssl=/usr/local
./configure --with-openssl=/usr/local/xxx

结果出现了不同的结果

第一种不会安装 openssl 模块
第二种可以正常安装 openssl 模块
第三种可以正常安装 openssl 模块 (我的电脑存在 /usr/local/include/openssl/evp.h)
第四种会报错:configure: error: Cannot find OpenSSL's evp.h (我的电脑 /usr/local/xxx 是空目录)

预编译扩展信息完成提示

复制代码
+--------------------------------------------------------------------+
| License:                                                           |
| This software is subject to the PHP License, available in this     |
| distribution in the file LICENSE. By continuing this installation  |
| process, you are bound by the terms of this license agreement.     |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point.                            |
+--------------------------------------------------------------------+

Thank you for using PHP.

configure: WARNING: unrecognized options: --enable-inline-optimization, --with-libxml-dir, --with-xmlrpc, --with-mcrypt, --with-pcre-regex, --with-pcre-dir, --with-gd, --with-jpeg-dir, --with-png-dir, --with-freetype-dir, --enable-gd-native-ttf, --enable-json, --enable-mbregex-backtrack, --with-libmbfl, --with-onig, --enable-wddx, --with-libxml-dir, --enable-zip

编译参数-使用

./configure -h

在源代码目录中,该命令可以查看所有编译参数以及对应的英文解释

编译参数-说明

复制代码
--prefix=/opt/php //指定 php 安装目录
--with-apxs2=/usr/local/apache/bin/apxs //整合Apache
--with-config-file-path=/opt/php/etc //指定php.ini位置
--with-config-file-scan-dir=/opt/php/etc/php.d //指定额外拓展配置归放处文件夹
--enable-safe-mode //打开安全模式
--enable-ftp //打开ftp的支持
--enable-zip //打开对zip的支持
--with-bz2 //打开对bz2文件的支持
--with-jpeg-dir //打开对jpeg图片的支持
--with-png-dir //打开对png图片的支持
--with-freetype-dir //打开对freetype字体库的支持
--without-iconv //关闭iconv函数,各种字符集间的转换
--with-libXML-dir //打开libxml2库的支持
--with-XMLrpc //打开xml-rpc的c语言
--with-zlib-dir //打开zlib库的支持
--with-gd //打开gd库的支持
--enable-gd-native-ttf //支持TrueType字符串函数库
--with-curl //打开curl浏览工具的支持
--with-curlwrappers //运用curl工具打开url流
--with-ttf //打开freetype1.*的支持,可以不加了
--with-xsl //打开XSLT 文件支持,扩展了libXML2库 ,需要libxslt软件
--with-gettext //打开gnu 的gettext 支持,编码库用到
--with-pear //打开pear命令的支持,PHP扩展用的
--enable-calendar //打开日历扩展功能
--enable-mbstring //多字节,字符串的支持
--enable-bcmath //精度计算,解决蛋疼的数字运算精度问题
--enable-sockets //打开 sockets 支持
--enable-exif //图片的元数据支持
--enable-magic-quotes //魔术引用的支持
--disable-rpath //关闭额外的运行库文件
--disable-debug //关闭调试模式
--with-ldap-dir //轻量目录访问协议

4、编译和安装

复制代码
make && make install

错误提示

1、make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1

因为系统的内存不足1G造成的,然后需要加上 --disable-fileinfo,然重新编译即可;

即在执行 ./configure 时--enable-fileinfo 改为 --disable-fileinfo

清除原编译 make clean,重新生成makefile文件

成功make提示

复制代码
Build complete.
Don't forget to run 'make test'.

成功make install 提示

复制代码
[root@VM_0_12_centos php-src-php-8.0.0]# make install
Installing shared extensions:     /usr/local/php800/lib/php/extensions/no-debug-non-zts-20200930/
Installing PHP CLI binary:        /usr/local/php800/bin/
Installing PHP CLI man page:      /usr/local/php800/php/man/man1/
Installing PHP FPM binary:        /usr/local/php800/sbin/
Installing PHP FPM defconfig:     /usr/local/php800/etc/
Installing PHP FPM man page:      /usr/local/php800/php/man/man8/
Installing PHP FPM status page:   /usr/local/php800/php/php/fpm/
Installing phpdbg binary:         /usr/local/php800/bin/
Installing phpdbg man page:       /usr/local/php800/php/man/man1/
Installing PHP CGI binary:        /usr/local/php800/bin/
Installing PHP CGI man page:      /usr/local/php800/php/man/man1/
Installing build environment:     /usr/local/php800/lib/php/build/
Installing header files:          /usr/local/php800/include/php/
Installing helper programs:       /usr/local/php800/bin/
  program: phpize
  program: php-config
Installing man pages:             /usr/local/php800/php/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /usr/local/php800/lib/php/php/
--2020-11-26 12:29:14--  https://pear.php.net/install-pear-nozlib.phar
Resolving pear.php.net (pear.php.net)... 109.203.101.62
Connecting to pear.php.net (pear.php.net)|109.203.101.62|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3634227 (3.5M)
Saving to: 'pear/install-pear-nozlib.phar'

100%[==========================================================================================================================>] 3,634,227   17.5KB/s   in 2m 47s 

2020-11-26 12:32:02 (21.3 KB/s) - 'pear/install-pear-nozlib.phar' saved [3634227/3634227]

[PEAR] Archive_Tar    - installed: 1.4.9
[PEAR] Console_Getopt - installed: 1.4.3
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util       - installed: 1.4.5
warning: pear/PEAR dependency package "pear/Archive_Tar" installed version 1.4.9 is not the recommended version 1.4.4
[PEAR] PEAR           - installed: 1.10.12
Warning! a PEAR user config file already exists from a previous PEAR installation at '/root/.pearrc'. You may probably want to remove it.
Wrote PEAR system config file at: /usr/local/php800/etc/pear.conf
You may want to add: /usr/local/php800/lib/php/php to your php.ini include_path
/home/humx/php-src-php-8.0.0/build/shtool install -c ext/phar/phar.phar /usr/local/php800/bin/phar.phar
ln -s -f phar.phar /usr/local/php800/bin/phar
Installing PDO headers:           /usr/local/php800/include/php/ext/pdo/

5、成功安装的测试工作

进入到/usr/local/php800/bin中运行 ./php -m,查看扩展安装情况

复制代码
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
exif
filter
ftp
gettext
gmp
hash
iconv
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
readline
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
sqlite3
standard
sysvmsg
sysvsem
sysvshm
tokenizer
xml
xmlreader
xmlwriter
xsl
zlib
[Zend Modules]

php8一些配置

配置php.ini

进行到php8的源代码根目录中操作(编译过程中制定了位置):

复制代码
cp php.ini-production /usr/local/php800/etc/php.ini

配置环境变量

复制代码
ln -s /usr/local/php800 /usr/bin/php8

或者添加 /etc/profile 进行配置,在末尾追加如下记录:

复制代码
# PHP8
export PATH=$PATH:/usr/local/php800/bin

source /etc/profile 生效

配置php-fpm

配置下如下环境,可以修改监听的端口等

复制代码
cd /usr/local/php800/etc
cp php-fpm.conf.default php-fpm.conf

cd /usr/local/php800/php-fpm.d
cp www.conf.default www.conf

配置php-fpm的pid文件

在php-fpm.conf中配置,将pid=run/php-fpm.pid前边的"#"去掉,并修改为php-fpm800

重启php-fpm即可生效

复制代码
[global]
; Pid file
; Note: the default prefix is /usr/local/php800/var
; Default Value: none
pid = run/php-fpm800.pid

安装composer

复制代码
cd /usr/local/php800/bin/
curl -sS https://getcomposer.org/installer | php8
cp composer.phar /usr/bin/composer8

# 阿里云 Composer 全量镜像
composer8 config -g repo.packagist composer https://mirrors.aliyun.com/composer/

# 中国全量镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com

# 更新 composer:
composer selfupdate

init.d的php-fpm服务的添加(跟systemd配置一个即可,php738采用此法启动)

/etc/init.d 是 /etc/rc.d/init.d 的软链接

php源码编译目录下的 sapi/fpm/init.d.php-fpm 文件拷贝到系统配置 /etc/init.d 目录下并重命名为 php-fpm

复制代码
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm 
chmod +x /etc/init.d/php-fpm

# 启动命令
service php-fpm start
service php-fpm stop
service php-fpm restart
service php-fpm reload
 或
/etc/init.d/php-fpm start
/etc/init.d/php-fpm stop
/etc/init.d/php-fpm restart
/etc/init.d/php-fpm reload

添加一个php8.0.0的systemd

复制代码
vim /lib/systemd/system/php800-fpm.service

内容如下

复制代码
[Unit]
Description=The PHP 8.0.0 FastCGI Process Manager
Documentation=man:php-fpm800(8)
After=network.target

[Service]
Type=simple
PIDFile=/usr/local/php800/var/run/php800-fpm.pid
ExecStart=/usr/local/php800/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php800/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.targe

opcache配置

复制代码
[opcache]
zend_extension=opcache.so
opcache.enable=1 
opcache.jit_buffer_size=100M
opcache.jit=1255

systemctl运行php800-fpm服务器

复制代码
# 启动
systemctl start php800-fpm
# 重启
systemctl restart php800-fpm
# 停止
systemctl stop php800-fpm

laravel

创建一个laravel项目,名称叫php8

复制代码
cd /var/www/html
composer8 create-project --prefer-dist laravel/laravel php8

配置一下.env文件

nginx配置

复制代码
server {
    listen 80;
    server_name bbs.ekanshu.com.cn;
    access_log  /tmp/php8.log main;
    root /var/www/html/php8/public;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php {
        fastcgi_pass unix:/run/php/php800-fpm.sock;
        fastcgi_index /index.php;

        include fastcgi_params;

        fastcgi_split_path_info       ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

添加一个接口

laravel7的路由写法在laravel8中有点问题,改下 RouteServiceProvider.php的写法。比如API路由,将 $this->namespace改为 App\Http\Controllers\Api。

复制代码
public function boot()
{
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace('App\Http\Controllers\Api')
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
}

其他一样,不用修改。加个测试接口看看:

复制代码
Route::get('/test','WxController@test');

test接口查一条数据并返回

复制代码
<?php

namespace App\Http\Controllers\Api;

use App\Models\WareHouses;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;

class WxController extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function test(Request $request)
{
        return WareHouses::find(1)->toarray();
    }
}

对比测试PHP7

本次使用PHP7.3,接口代码和PHP8一致,两者都开启opcache。

服务器配置是1核2G,用ab简单测试下。

先测试php8的ab结果

复制代码
ab -n 100 -c 10 http://php8.humengxu.com/api/test

This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking php8.humengxu.com (be patient).....done


Server Software:        nginx
Server Hostname:        php8.humengxu.com
Server Port:            80

Document Path:          /api/test
Document Length:        2042 bytes

Concurrency Level:      10
Time taken for tests:   3.098 seconds
Complete requests:      100
Failed requests:        38
   (Connect: 0, Receive: 0, Length: 38, Exceptions: 0)
Write errors:           0
Non-2xx responses:      38
Total transferred:      409699 bytes
HTML transferred:       377214 bytes
Requests per second:    32.28 [#/sec] (mean)
Time per request:       309.770 [ms] (mean)
Time per request:       30.977 [ms] (mean, across all concurrent requests)
Transfer rate:          129.16 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   1.3      2       8
Processing:     8  273 351.5     94    1474
Waiting:        8  178 245.2     94    1473
Total:          9  275 351.8     96    1476

Percentage of the requests served within a certain time (ms)
  50%     96
  66%    115
  75%    280
  80%    627
  90%    823
  95%   1014
  98%   1476
  99%   1476
 100%   1476 (longest request)

再测试php7.4的ab结果

复制代码
ab -n 100 -c 10 http://php74.humengxu.com/api/test


This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking php74.humengxu.com (be patient).....done


Server Software:        nginx
Server Hostname:        php74.humengxu.com
Server Port:            80

Document Path:          /api/test
Document Length:        2042 bytes

Concurrency Level:      10
Time taken for tests:   3.001 seconds
Complete requests:      100
Failed requests:        32
   (Connect: 0, Receive: 0, Length: 32, Exceptions: 0)
Write errors:           0
Non-2xx responses:      32
Total transferred:      379497 bytes
HTML transferred:       349896 bytes
Requests per second:    33.33 [#/sec] (mean)
Time per request:       300.061 [ms] (mean)
Time per request:       30.006 [ms] (mean, across all concurrent requests)
Transfer rate:          123.51 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   2.4      3      15
Processing:     9  249 379.7    102    1685
Waiting:        9  154 258.1     94    1487
Total:          9  251 379.7    106    1688

Percentage of the requests served within a certain time (ms)
  50%    106
  66%    122
  75%    213
  80%    219
  90%    685
  95%   1433
  98%   1557
  99%   1688
 100%   1688 (longest request)
相关推荐
JaguarJack17 小时前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo17 小时前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack2 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo2 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack2 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay3 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954483 天前
CTF 伪协议
php
BingoGo6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo7 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php