编译安装PHP8和Swoole4

2020-12-25 11:14:48 浏览数 (1)

PHP8 在 6 月 25 号发布了 alpha1 版本,JIT 是大家最为关心的一个功能,鸟哥也亲自下场写了一篇《PHP8 新特性之 JIT 简介》[1],感兴趣的同学可以去看看。

很多使用 Swoole 的同学都想在 PHP8 中体验一下性能,奈何编译不过...这篇文章我们就来编译一下 PHP8 和 Swoole4。

PHP8

首先获取 PHP8-alpha1 的源码,由于码云暂时关闭了 mirros 仓库[2]的下载通道,我们就直接从 PHP 官网下载吧,解压并进入对应目录

代码语言:javascript复制
wget https://downloads.php.net/~pollita/php-8.0.0alpha1.tar.gz

tar -zxvf php-8.0.0alpha1.tar.gz

cd php-8.0.0alpha1/

然后我们就可以配置编译参数来进行编译了,至于配置参数的变更、弃用这里就跳过了

代码语言:javascript复制
./configure --prefix=/usr/local/php8 --enable-opcache --with-config-file-path=/usr/local/php8/etc --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm --enable-static --enable-sockets --with-zip --enable-calendar --enable-bcmath --enable-mbstring --with-zlib --with-iconv=/usr/local/libiconv --enable-gd --enable-mbstring --with-curl --with-freetype --with-mysql-sock=/tmp/mysql.sock --disable-ipv6 --disable-debug --with-openssl --enable-intl --enable-opcache

在执行中可能会遇到一些问题,这里简单说明一下:

  1. configure: error: iconv does not support errno
代码语言:javascript复制
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
./configure --prefix=/usr/local/libiconv
make && make install
  1. No package 'oniguruma' found
代码语言:javascript复制
yum install oniguruma-devel
  1. No package 'libzip' found 或者 Requested 'libzip >= 0.11' but version of libzip is 0.10.1
代码语言:javascript复制
checking for libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0... no
configure: error: Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met:

Requested 'libzip >= 0.11' but version of libzip is 0.10.1

这个报错提示非常明显,配置程序没有找到 libzip 库或者找到了但是版本低于0.11,你用 yum 安装 libzip-devel 的话,安装的版本是 0.10,版本达不到要求。所以,我们需要卸载掉 yum 安装的 libzip 然后手动安装新版。

代码语言:javascript复制
yum remove libzip libzip-devel

wget https://libzip.org/download/libzip-1.2.0.tar.gz
tar -zxvf libzip-1.2.0.tar.gz
cd libzip-1.2.0
./configure
make && make install

这个时候还需要 PHP 的 configure 程序你安装的 libzip 在哪里,刚才安装 libzip 是在/usr/local/lib,可以使用ls -l /usr/local/lib查看目录,就可以看到libzip.so libzip.so.5 libzip.so.5.0.0 还有一个pkgconfig目录,然后我们再在 configure 的会话窗口直接输入:

代码语言:javascript复制
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"

再次执行文章开头的./configure ...就会很顺利的看到Thank you for using PHP.

然后执行make && make install等待安装成功,安装完成后执行命令查看版本信息

代码语言:javascript复制
$ /usr/local/php8/bin/php -v
PHP 8.0.0alpha1 (cli) (built: Jun 28 2020 17:27:11) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies

复制 php.ini 配置文件

代码语言:javascript复制
cp php.ini-production /usr/local/php8/etc/php.ini

因为 PHP8 的 JIT 是在 Opcache 之中提供的,所以我们还需要修改配置文件加上zend_extension=opcache.so

Swoole4

Swoole 目前已经在 master 分支支持了 PHP8,由于还没有发布版本,所以有些同学使用 v4.5.2 编译时会出错,这里直接使用 master 分支代码进行编译

代码语言:javascript复制
git clone git@github.com:swoole/swoole-src.git --depth=1
/usr/local/php8/bin/phpize
./configure --enable-openssl --enable-sockets --enable-mysqlnd --enable-http2 --with-php-config=/usr/local/php8/bin/php-config
make
make install

编译完成后修改 php.ini 加入extension=swoole.so

执行php -m查看安装的扩展

代码语言:javascript复制
$ /usr/local/php8/bin/php -m
[PHP Modules]
bcmath
calendar
Core
ctype
curl
date
dom
fileinfo
filter
gd
hash
iconv
intl
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
sockets
SPL
sqlite3
standard
swoole
tokenizer
xml
xmlreader
xmlwriter
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache

执行php --ri swoole查看 swoole 扩展版本

代码语言:javascript复制
$ /usr/local/php8/bin/php --ri swoole

swoole

Swoole => enabled
Author => Swoole Team <team@swoole.com>
Version => 4.5.3-alpha
Built => Jun 28 2020 17:46:50
coroutine => enabled
epoll => enabled
eventfd => enabled
signalfd => enabled
cpu_affinity => enabled
spinlock => enabled
rwlock => enabled
sockets => enabled
openssl => OpenSSL 1.0.2k-fips  26 Jan 2017
http2 => enabled
pcre => enabled
zlib => 1.2.7
mutex_timedlock => enabled
pthread_barrier => enabled
futex => enabled
mysqlnd => enabled
async_redis => enabled

Directive => Local Value => Master Value
swoole.enable_coroutine => On => On
swoole.enable_library => On => On
swoole.enable_preemptive_scheduler => Off => Off
swoole.display_errors => On => On
swoole.use_shortname => On => On
swoole.unixsock_buffer_size => 8388608 => 8388608

大家现在就可以去体验 PHP8 Swoole 了

参考资料

[1]

《PHP8 新特性之 JIT 简介》: https://www.laruence.com/2020/06/27/5963.html

[2]

mirros 仓库: https://gitee.com/mirrors/php-src

0 人点赞