9.1 KiB
编译安装PHP8.2
wandoubaba / 2023-07-21
以Debian11操作系统为例。
本文目标:在纯净的操作系统上安装PHP8.2环境,同时安装composer和pecl,并通过pecl安装一些常用的扩展,最终实现在环境中运行基于Workerman和Swoole框架的项目。
安装依赖
sudo apt-get install -y \
wget make gcc curl \
libxml2 libxml2-dev \
libsqlite3-dev \
libwebp-dev libonig-dev \
libsodium-dev pkg-config \
libssl-dev openssl \
libgd-dev build-essential \
zlib1g-dev libpcre3-dev \
lsb-release autoconf \
libzip-dev unzip
安装libcurl
wget https://curl.se/download/curl-8.2.0.tar.gz
tar zxvf curl-8.2.0.tar.gz
cd curl-8.2.0
./configure --with-openssl
make
make install
创建安装目录
为了让多个版本的PHP可以共存,我们不准备把PHP安装到默认目录内,而是为每个版本设置一个目录。
mkdir -p /www/server/php/82/etc
创建www用户和组
查看www用户是否存在
id www
创建www分组和www用户,并且不允许登录系统
groupadd www
useradd -g www -s /sbin/nologin www
再查看www用户
id www
为www用户创建home目录,composer会用到。
mkdir /home/www
chown www:www -R /home/www
usermod -d /home/www www
下载PHP
wget https://www.php.net/distributions/php-8.2.8.tar.gz
解压&编译&安装
tar zxvf php-8.2.8.tar.gz
cd php-8.2.8
./configure \
--prefix=/www/server/php/82 \
--with-config-file-path=/www/server/php/82/etc \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-freetype \
--with-jpeg \
--with-zlib \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--with-curl \
--enable-mbregex \
--enable-mbstring \
--enable-intl \
--enable-ftp \
--enable-gd \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--enable-soap \
--with-gettext \
--disable-fileinfo \
--enable-opcache \
--with-sodium=/usr/local/libsodium \
--with-webp
make
sudo make install
创建全局命令
ln -s /www/server/php/82/bin/php /usr/local/bin/php
ln -s /www/server/php/82/bin/phpize /usr/local/bin/phpize
创建php.ini
在PHP的源码目录下有php.ini-development
和php.ini-production
两个文件,分别表示“开发环境配置”和“生产环境配置”,这里我们直接使用生产环境的。
cp php.ini-production /www/server/php/82/etc/php.ini
安装composer
cd /www/server/php/82/bin
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
ln -s /www/server/php/82/bin/composer.phar /usr/local/bin/composer
composer selfupdate
composer --version
把composer源改成国内镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
安装pecl
pecl是可以方便为PHP安装扩展的工具。
cd /www/server/php/82/bin
wget http://pear.php.net/go-pear.phar
php go-pear.phar
ln -s /www/server/php/82/bin/pecl /usr/local/bin/pecl
安装扩展
- event扩展
event扩展可以使基于Workerman的项目发挥更高的性能。
注意提示:Include libevent OpenSSL support [yes] : 时输入no回车,其它直接敲回车就行。
apt-get install libevent-dev -y
pecl install event
安装成功后,命令行会提示编译后的库文件所在的位置,如/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/event.so
。
在php.ini
文件的最后添加下面的内容:
[event]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/event.so"
再执行php -m
命令后会看到event
扩展出现在了已安装的扩展列表中,说明扩展安装成功。
- zip扩展
pecl install zip
在php.ini
文件的最后添加:
[zip]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/zip.so"
- redis扩展
pecl install redis
在php.ini
文件的最后添加:
[redis]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/redis.so"
- swoole扩展
pecl install swoole
在php.ini
文件的最后添加:
[swoole]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/swoole.so"
- protobuf扩展
如果项目中需要使用到gRPC服务端或客户端,就要安装protobuf扩展
pecl install protobuf
在php.ini
文件的最后添加:
[protobuf]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/protobuf.so"
- xlswriter扩展
如果项目中需要读或写excel文件,可以尝试一下这个扩展,它的最大特点的就解析速度,无论读还是写(但是并不具备phpoffice/phpspreadsheet的所有功能)。
pecl install xlswriter
在php.ini
文件的最后添加:
[xlswriter]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/xlswriter.so"
- pdo_pgsql扩展
如果项目中需要使用postgresql数据库,就需要安装这个扩展。
先安装pg数据库的驱动库libpg:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install libpq-dev
然后进入PHP源代码目录中的ext/pdo_pgsql
目录下
## 注意要把下面的path/to换成实际路径
cd path/to/php-8.2.8/ext/pdo_pgsql
phpize
./configure --with-php-config=/www/server/php/82/bin/php-config
make
make install
在php.ini
文件的最后添加:
[pdo_pgsql]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/pdo_pgsql.so"
- fileinfo扩展
fileinfo通过在文件的给定位置查找特定的魔术字节序列,来获取文件的MIME信息。laravel框架依赖这个扩展。
进入PHP源代码目录中的ext/fileinfo
目录下
## 注意要把下面的path/to换成实际路径
cd path/to/php-8.2.8/ext/fileinfo
phpize
./configure --with-php-config=/www/server/php/82/bin/php-config
make
make install
在php.ini
文件的最后添加:
[fileinfo]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/fileinfo.so"
测试
独立的php-cli环境已经安装完成了,下面我们可以用简单的HTTP服务框架webman
测试一下。
mkdir /www/wwwroot
cd /www/wwwroot
composer create-project workerman/webman
cd webman
php start.php start
一切顺利的话,应该可以在命令行中看到已经启动了名为webman
的服务进程,默认监听端口8787
Workerman[start.php] start in DEBUG mode
------------------------------------------- WORKERMAN -------------------------------------------
Workerman version:4.1.11 PHP version:8.2.8 Event-Loop:\Workerman\Events\Event
-------------------------------------------- WORKERS --------------------------------------------
proto user worker listen processes status
tcp root webman http://0.0.0.0:8787 16 [OK]
tcp root monitor none 1 [OK]
-------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
这个时候使用浏览器访问http://ip:8787
就可以看到webman框架的欢迎页了。
启用php-fpm
为了与nginx整合以支持类似laravel或tp这样的fpm框架,我们还需要启动php-fpm服务。
ln -s /www/server/php/82/sbin/php-fpm /usr/local/bin/php-fpm
cd /www/server/php/82/etc/php-fpm.d
cp www.conf.default www.conf
php-fpm
要实现多版本PHP环境共存,主要是解决不同版本的php-fpm服务监听端口冲突的问题,我们可以做个约定规则,就是让各个版本的php-fpm都监听90xx
端口,比如我们现在安装的是8.2版本,那就让它的php-fpm监听9082
端口。
修改www.conf
文件,找到listen = 127.0.0.1:9000
一行,把它改为listen = 127.0.0.1:9082
,保存退出即可。
下面要把php-fpm注册为系统服务。
touch /etc/systemd/system/php-fpm.service
vim /etc/systemd/system/php-fpm.service
文件内容:
[Unit]
Description=The PHP 8.2 FastCGI Process Manager
After=network.target
[Service]
Type=simple
PIDFile=/run/php-fpm.pid
ExecStart=/www/server/php/82/sbin/php-fpm --nodaemonize --fpm-config /www/server/php/82/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 MAINPID
ExecStop=/bin/kill −SIGINT MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
保存退出后执行下面的命令:
sudo systemctl daemon-reload
sudo systemctl enable php-fpm
服务控制命令:
sudo systemctl start php-fpm
sudo systemctl restart php-fpm
sudo systemctl stop php-fpm
sudo systemctl reload php-fpm
sudo systemctl status php-fpm