knowledge/docs/php/php82.md

394 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 编译安装PHP8.2
> wandoubaba / 2023-07-21
以Debian11操作系统为例。
本文目标在纯净的操作系统上安装PHP8.2环境同时安装composer和pecl并通过pecl安装一些常用的扩展最终实现在环境中运行基于Workerman和Swoole框架的项目。
## 安装依赖
```sh
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`
```sh
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安装到默认目录内而是为每个版本设置一个目录。
```sh
mkdir -p /www/server/php/82/etc
```
## 创建www用户和组
查看www用户是否存在
```sh
id www
```
创建www分组和www用户并且不允许登录系统
```sh
groupadd www
useradd -g www -s /sbin/nologin www
```
再查看www用户
```sh
id www
```
为www用户创建home目录composer会用到。
```sh
mkdir /home/www
chown www:www -R /home/www
usermod -d /home/www www
```
## 下载PHP
```sh
wget https://www.php.net/distributions/php-8.2.8.tar.gz
```
## 解压&编译&安装
```sh
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
```
## 创建全局命令
```sh
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`两个文件,分别表示“开发环境配置”和“生产环境配置”,这里我们直接使用生产环境的。
```sh
cp php.ini-production /www/server/php/82/etc/php.ini
```
## 安装composer
```sh
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源改成国内镜像
```sh
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
```
## 安装pecl
pecl是可以方便为PHP安装扩展的工具。
```sh
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回车其它直接敲回车就行。
```sh
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`文件的最后添加下面的内容:
```ini
[event]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/event.so"
```
再执行`php -m`命令后会看到`event`扩展出现在了已安装的扩展列表中,说明扩展安装成功。
- zip扩展
```sh
pecl install zip
```
在`php.ini`文件的最后添加:
```ini
[zip]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/zip.so"
```
- redis扩展
```sh
pecl install redis
```
在`php.ini`文件的最后添加:
```ini
[redis]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/redis.so"
```
- swoole扩展
```sh
pecl install swoole
```
在`php.ini`文件的最后添加:
```ini
[swoole]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/swoole.so"
```
- protobuf扩展
如果项目中需要使用到gRPC服务端或客户端就要安装protobuf扩展
```sh
pecl install protobuf
```
在`php.ini`文件的最后添加:
```ini
[protobuf]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/protobuf.so"
```
- xlswriter扩展
如果项目中需要读或写excel文件可以尝试一下这个扩展它的最大特点的就解析速度无论读还是写但是并不具备phpoffice/phpspreadsheet的所有功能
```sh
pecl install xlswriter
```
在`php.ini`文件的最后添加:
```ini
[xlswriter]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/xlswriter.so"
```
- pdo_pgsql扩展
如果项目中需要使用postgresql数据库就需要安装这个扩展。
先安装pg数据库的驱动库libpg
```sh
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`目录下
```sh
## 注意要把下面的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`文件的最后添加:
```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`目录下
```sh
## 注意要把下面的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`文件的最后添加:
```ini
[fileinfo]
extension="/www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/fileinfo.so"
```
## 测试
独立的php-cli环境已经安装完成了下面我们可以用简单的HTTP服务框架`webman`测试一下。
```sh
mkdir /www/wwwroot
cd /www/wwwroot
composer create-project workerman/webman
cd webman
php start.php start
```
一切顺利的话,应该可以在命令行中看到已经启动了名为`webman`的服务进程,默认监听端口`8787`
```sh
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服务。
```sh
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注册为系统服务。
```sh
touch /etc/systemd/system/php-fpm.service
vim /etc/systemd/system/php-fpm.service
```
文件内容:
```ini
[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
```
保存退出后执行下面的命令:
```sh
sudo systemctl daemon-reload
sudo systemctl enable php-fpm
```
服务控制命令:
```sh
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
```