使用yum-remi部署PHP及其依赖
# 1,历史
以往 PHP 大多都是使用源码安装,或者使用自行封装成 RPM 包的姿势来进行安装。
- 源码安装的优点是灵活性强,后期模块儿自定义添加调整都比较方便。
- 自行封装 RPM 初期工作比较费劲儿,不过梳理好当前生产所需的依赖模块儿之后,后期的标准化维护工作会轻松很多。
不过这里依然遵循一个道理,也是我们接触互联网技术深入以来的一个体会:有些技术或者事物看似简单,实际使用起来背后则隐藏着复杂,有些技术或者事物看似复杂,实际使用起来背后则体现着简单。
从中国古代的智慧来看,这叫福祸相依
。
这一点在我们同时维护 PHP 以及 golang 项目的过程中,体会尤为深切,比如 PHP 属于解释性语言,常规部署方式是源码丢到服务器上,交给 fpm 解析,这给开发 debug 带来了不少便利,能够在不通过走提交代码,合并代码,走 CICD 流程的情况下直接修改源码来 debug,但是,假如这个 debug 的调整会影响其他正在测试的同学呢,假如添加了调试代码而又忘记去掉了呢,我们这边可是不止一次遇到过这种问题,以至于我们不得不把服务器权限全部都收掉,彻底断掉开发者直接通过 vim 来调试代码的路径。对比而言,诸如 golang 或者 Java,如果你觉得你提交的代码是有问题的,那么你就不得不在本地自行调试,然后运行起来看一下,再发布到测试去。因此,看起来能够高效开发迭代的 PHP,事实上反而将开发者惯坏,从而经常提交了有问题的代码到测试环境去,而看起来老得编译验证的 golang,类似这样的问题则少却很多。
话说回来,源码安装的优点是灵活性强,但是如果你有五十个 PHP 项目,它们的依赖各不一样,而且依赖添加的需求并不是同一时刻提出来的,于是经过两年的维护之下,这五十个项目的 PHP 环境则各不一样,很难梳理出一个统一的标准出来。自行封装 RPM 的一个问题在于,一些依赖如果要重新调整,比如基础包添加 gd 库的时候没有 enable 掉 free-type,那么这个时候重新添加这个包就会成为一个大难题。
# 2,前言
而今天要介绍的 remi 的方案,则是如上两种方式的折中方案,兼并两种方案的共同优点,值得推荐。
Remi repository (opens new window)是包含最新版本 php 和 mysql 包的 linux 源。
- 它完全基于 RPM 包管理,不必再身陷各种编译难题中。
- 它可以像源码管理时添加依赖那样,使用 yum 命令就可以添加好对应的依赖。
# 3,使用
# 1,添加 yum 源
yum install -y epel-release
yum install -y https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
2
此时可以看到多了不少源:
$ ll /etc/yum.repos.d/
-rw-r--r-- 1 root root 614 Aug 4 19:50 CentOS-Base.repo
-rw-r--r-- 1 root root 230 Aug 4 19:50 CentOS-Epel.repo
-rw-r--r-- 1 root root 616 Apr 8 2020 CentOS-x86_64-kernel.repo
-rw-r--r-- 1 root root 1050 Nov 1 2020 epel.repo
-rw-r--r-- 1 root root 1149 Nov 1 2020 epel-testing.repo
-rw-r--r-- 1 root root 446 Jan 5 2021 remi-glpi91.repo
-rw-r--r-- 1 root root 446 Jan 5 2021 remi-glpi92.repo
-rw-r--r-- 1 root root 446 Jan 5 2021 remi-glpi93.repo
-rw-r--r-- 1 root root 446 Jan 5 2021 remi-glpi94.repo
-rw-r--r-- 1 root root 855 Jan 5 2021 remi-modular.repo
-rw-r--r-- 1 root root 456 Jan 5 2021 remi-php54.repo
-rw-r--r-- 1 root root 1314 Jan 5 2021 remi-php70.repo
-rw-r--r-- 1 root root 1314 Jan 5 2021 remi-php71.repo
-rw-r--r-- 1 root root 1314 Jan 5 2021 remi-php72.repo
-rw-r--r-- 1 root root 1314 Jan 5 2021 remi-php73.repo
-rw-r--r-- 1 root root 1314 Jan 5 2021 remi-php74.repo
-rw-r--r-- 1 root root 1314 Jan 5 2021 remi-php80.repo
-rw-r--r-- 1 root root 2605 Jan 5 2021 remi.repo
-rw-r--r-- 1 root root 750 Jan 5 2021 remi-safe.repo
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
这个时候,我们可以基于这个源拿到 PHP 各大版本中最后一个版本的 RPM 包及其依赖,使用如下命令能够看到所有的包:
yum list |egrep 'php70|php71|php72|php73|php74'
其中一些依赖这里整理如下:
php74:安装PHP 7.4的包
php74-php:用于创建动态web的PHP脚本语言网站
php74-build:基本的构建配置
php74-php-gd:用于PHP应用程序使用gd的模块图形库
php74-xhprof:一个用于PHP - Web接口的层次分析器
php74-zephir:用于创建扩展的Zephir语言PHP:
php74-php-ast:抽象语法树
php74-php-cli:用于PHP的命令行接口
php74-php-dba:一个用于PHP的数据库抽象层模块应用程序
php74-php-dbg:交互式PHP调试器
php74-php-ffi:外部函数接口
php74-php-fpm:PHP FastCGI进程管理器
php74-php-gmp:一个用于使用GNU的PHP应用程序模块议员库
php74-php-lz4:x86_64: PHP的LZ4扩展
php74-php-pdo:一个用于PHP的数据库访问抽象模块应用程序
php74-php-xml:x86_64:用于使用XML的PHP应用程序的模块
php74-runtime:处理php74软件集合的包:
php74-php-imap:x86_64:用于使用IMAP的PHP应用程序的模块
php74-php-intl:x86_64: PHP国际化扩展应用程序
php74-php-json:x86_64: PHP的JavaScript对象符号扩展
php74-php-ldap:x86_64:用于使用LDAP的PHP应用程序的模块
php74-php-oci8:x86_64:用于使用OCI8的PHP应用程序的模块数据库
php74-php-odbc:x86_64:用于使用ODBC的PHP应用程序的模块数据库
php74-php-pear:noarch: PHP扩展和应用程序库框架
php74-php-pggi:GTK绑定
php74-php-snmp:一个用于PHP应用程序查询的模块SNMP-managed设备
php74-php-soap:用于使用SOAP的PHP应用程序的模块协议
php74-php-tidy:标准PHP模块提供了tidy库支持
php74-php-zstd:x86_64: Zstandard扩展名
php74-scldevel:x86_64:打包php74的开发文件
php74-unit-php:用于NGINX单元的PHP模块
php74-php-devel:构建PHP扩展所需的文件
php74-php-pgsql:一个用于PHP的PostgreSQL数据库模块
php74-php-pinba:x86_64: Pinba统计服务器的客户端扩展
php74-php-bcmath:用于PHP应用程序的模块bcmath库
php74-php-brotli:用于PHP的Brotli扩展
php74-php-common:PHP的公共文件
php74-php-pspell:x86_64:用于PHP应用程序的模块中接口
php74-php-recode:用于PHP应用程序的模块重新编码库
php74-php-snappy:PHP的Snappy扩展
php74-php-sodium:x86_64:钠密码库的包装
php74-php-sqlsrv:x86_64:用于SQL Server的PHP Microsoft驱动程序
php74-php-xmlrpc:的PHP应用程序模块xml - rpc协议
php74-php-enchant:增强PHP的拼写扩展应用程序
php74-php-libvirt:用于Libvirt的PHP语言绑定
php74-php-mysqlnd:x86_64:用于使用MySQL的PHP应用程序的模块数据库
php74-php-opcache:x86_64: Zend OPcache
php74-php-pecl-ds:x86_64: PHP的数据结构
php74-php-pecl-ev:提供libev库的接口
php74-php-pecl-pq:PostgreSQL客户端库(libpq)绑定
php74-php-pecl-uv:Libuv包装器
php74-php-process:用于PHP脚本的模块使用系统进程接口
php74-php-embedded:用于嵌入应用程序的PHP库
php74-php-mbstring:一个用于PHP应用程序的模块多字节字符串处理
php74-php-pecl-dio:直接I/O函数
php74-php-pecl-eio:提供libeio库的接口
php74-php-pecl-env:加载环境变量
php74-php-pecl-lua:嵌入式lua解释器
php74-php-pecl-lzf:x86_64:处理LZF de/压缩的扩展
php74-php-pecl-nsq:NSQ客户端的PHP扩展
php74-php-pecl-psr:PSR接口
php74-php-pecl-rar:用于读取RAR存档的PHP扩展
php74-php-pecl-rrd:x86_64: rrdtool的PHP绑定
php74-php-pecl-sdl:简单的PHP DirectMedia层
php74-php-pecl-svn:x86_64: Subversion版本的PHP绑定控制系统
php74-php-pecl-vld:x86_64:转储PHP的内部表示脚本
php74-php-pecl-yac:无锁用户数据缓存
php74-php-pecl-yaf:x86_64:又一个框架
php74-php-pecl-yar:轻量级并发RPC框架
php74-php-pecl-yaz:x86_64: Z39.50/SRU客户端
php74-php-pecl-zip:一个ZIP文件的扩展名
php74-php-pecl-zmq:ZeroMQ消息传递
php74-php-phalcon4:Phalcon框架
php74-php-componere:在运行时编写PHP类
php74-php-litespeed:LiteSpeed Web服务器PHP支持
php74-php-maxminddb:MaxMind DB Reader扩展
php74-php-pdo-dblib:x86_64: PDO驱动程序,用于Microsoft SQL Server和Sybase数据库
php74-php-pecl-amqp:与任何AMQP兼容的服务器通信
php74-php-pecl-apcu:APC用户缓存
php74-php-pecl-apfd:总是填充表单数据
php74-php-pecl-fann:用于FANN库的包装器
php74-php-pecl-grpc:x86_64:通用RPC框架
php74-php-pecl-http:扩展的HTTP支持
php74-php-pecl-krb5:Kerberos验证扩展
php74-php-pecl-pcov:x86_64:代码覆盖驱动程序
php74-php-pecl-ssh2:x86_64: libssh2库的绑定
php74-php-pecl-sync:已命名和未命名同步对象
php74-php-pecl-uopz:x86_64: Zend的用户操作
php74-php-pecl-uuid:通用唯一标识符扩展对于PHP
php74-php-pecl-vips:x86_64:与libvip接口的PHP扩展
php74-php-pecl-wddx:Web分布式数据交换
php74-php-pecl-yaml:x86_64: yaml的PHP绑定
php74-php-phpiredis:x86_64: Redis的客户端扩展名
php74-php-smbclient:libsmbclient的PHP包装
php74-php-wkhtmltox:HTML转换器
php74-php-pecl-cmark:CommonMark扩展名
php74-php-pecl-dbase:dBase数据库文件访问函数
php74-php-pecl-druid:一个PHP的德鲁伊驱动
php74-php-pecl-event:提供libevent库的接口
php74-php-pecl-geoip:将IP地址映射到的扩展名地理位置
php74-php-pecl-gnupg:x86_64: gpgme库的包装
php74-php-pecl-mysql:MySQL数据库访问函数
php74-php-pecl-oauth:PHP OAuth消费者扩展
php74-php-pecl-parle:x86_64:解析和词法分析
php74-php-pecl-raphf:资源和持久句柄工厂
php74-php-pecl-solr2:Apache Solr的API定向对象
php74-php-pecl-stats:用于统计计算的例程
php74-php-pecl-stomp:Stomp客户端扩展
php74-php-pecl-taint:x86_64: XSS代码嗅探器
php74-php-pecl-xattr:扩展属性
php74-php-pecl-xdiff:文件差异/补丁
php74-php-pecl-xxtea:XXTEA加密算法扩展PHP
php74-php-libvirt-doc:noarch: php-libvirt文件
php74-php-pecl-base58:用base58编码和解码数据
php74-php-pecl-bitset:位集库
php74-php-pecl-crypto:OpenSSL密码库的包装器
php74-php-pecl-gender:x86_64:性别扩展
php74-php-pecl-hprose:用于PHP的h散文
php74-php-pecl-hrtime:x86_64:高分辨率定时
php74-php-pecl-mcrypt:x86_64: libmcrypt库的绑定
php74-php-pecl-pdflib:生成PDF文件的包
php74-php-pecl-propro:属性代理
php74-php-pecl-radius:Radius客户端库
php74-php-pecl-redis4:的扩展名 Redis键值存储
php74-php-pecl-redis5:的扩展名 Redis键值存储
php74-php-pecl-scrypt:Scrypt散列函数
php74-php-pecl-sphinx:Sphinx SQL全文的PECL扩展搜索引擎
php74-php-pecl-ssdeep:libfuzzy库的包装器
php74-php-pecl-trader:为贸易商提供技术分析
php74-php-pecl-xdebug:用于调试PHP脚本的PECL包
php74-php-pecl-xhprof:x86_64: XHProf的PHP扩展,层次结构分析器
php74-php-pecl-yaconf:x86_64:另一个配置容器
php74-php-pecl-apcu-bc:APCu向后兼容模块
php74-php-pecl-decimal:任意精度浮点小数
php74-php-pecl-gearman:PHP包装器到libgearman
php74-php-pecl-gmagick:的包装器GraphicsMagick库
php74-php-pecl-imagick:x86_64:用于创建和修改映像的扩展使用ImageMagick
php74-php-pecl-inotify:x86_64: Inotify
php74-php-pecl-leveldb:LevelDB PHP绑定
php74-php-pecl-memprof:x86_64:内存使用分析器
php74-php-pecl-mongodb:x86_64:用于PHP的MongoDB驱动程序
php74-php-pecl-msgpack:用于与MessagePack通信的API序列化
php74-php-pecl-rdkafka:基于librdkafka的Kafka客户端
php74-php-pecl-rpminfo:x86_64: RPM信息
php74-php-pecl-runkit7:为了这些你…不应该…无论如何我一直在做……但是肯定做的!
php74-php-pecl-seaslog:一个有效、快速、稳定的日志 PHP扩展
php74-php-pecl-selinux:用于PHP脚本的SELinux绑定语言
php74-php-pecl-swoole4:PHP的异步并发分布式网络框架
php74-php-pecl-timecop:x86_64:时间旅行和冻结扩展
php74-php-pecl-varnish:Varnish缓存绑定
php74-php-pecl-xmldiff:x86_64: XML差异和合并
php74-php-pecl-igbinary:x86_64:替代标准PHP序列化器
php74-php-pecl-memcache:x86_64:使用Memcached的扩展缓存守护进程
php74-php-pecl-mogilefs:要与之通信的PHP客户端库 MogileFS存储
php74-php-pecl-mustache:Mustache模板语言
php74-php-pecl-protobuf:序列化结构化的机制数据
php74-php-pecl-rdkafka4:基于librdkafka的Kafka客户端
php74-php-pecl-scoutapm:本地扩展组件 ScoutAPM的PHP代理
php74-php-pecl-translit:将非拉丁字符音译设置为拉丁文
php74-php-snuffleupagus:x86_64: PHP的安全模块
php74-php-zephir-parser:x86_64: Zephir解析器扩展
php74-php-pecl-cassandra:用于Apache的DataStax PHP驱动程序卡桑德拉
php74-php-pecl-json-post:JSON POST处理程序
php74-php-pecl-mailparse:用于解析和的PHP PECL包处理电子邮件消息
php74-php-pecl-memcached:x86_64:使用Memcached的扩展缓存守护进程
php74-php-pecl-mosquitto:libmosquito - to的扩展
php74-php-pecl-seasclick:一个Yandex ClickHouse客户端驱动 PHP扩展
php74-php-pecl-xlswriter:一个高效、快速的xlsx文件出口扩展
php74-php-horde-horde-lz4:Horde LZ4压缩扩展
php74-php-pecl-apcu-devel:APCu开发人员文件(头文件)
php74-php-pecl-couchbase2:Couchbase服务器PHP扩展
php74-php-pecl-geospatial:PHP扩展来处理公共地理空间功能
php74-php-pecl-handlebars:Handlebars模板语言
php74-php-pecl-http-devel:x86_64:扩展HTTP支持开发人员文件(头)
php74-php-pecl-krb5-devel:Kerberos扩展开发人员文件(头)
php74-php-pecl-luasandbox:带有限制和安全的Lua解释器环境
php74-php-pecl-opencensus:一个stats集合和分布式跟踪框架
php74-php-pecl-skywalking:x86_64: Apache的PHP工具代理人行天桥
php74-php-pecl-ahocorasick:有效的Aho-Corasick字符串模式匹配算法
php74-php-pecl-ip2location:获取an的地理位置信息IP地址
php74-php-pecl-http-message:x86_64: PSR-7 HTTP消息实现
php74-php-pecl-datadog-trace:APM和分布式跟踪PHP
php74-php-pecl-hdr-histogram:x86_64: C语言的PHP扩展包装hdrhistogram API
php74-php-pecl-imagick-devel:imagick扩展开发人员文件(头)
php74-php-pecl-msgpack-devel:MessagePack开发人员文件(头)
php74-php-pecl-mysql-xdevapi:MySQL数据库访问函数
php74-php-pecl-mysqlnd-azure:x86_64: mysqlnd的重定向插件
php74-php-pecl-igbinary-devel:Igbinary开发人员文件(头)
php74-php-pecl-uploadprogress:x86_64:跟踪进度的扩展文件上传
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
其中的 php74-php.x86_64
为 7.4 这个大版本的主包,其他皆为依赖,如果想要安装 redis 依赖,则可以直接运行如下命令:
yum install -y php74-php-pecl-redis4.x86_64 php74-php-pecl-redis5.x86_64
这样就安装完成了。
# 2,直接安装
这个时候可以先梳理下自己所需要的依赖,然后找到依赖对应的 RPM 包,直接安装即可:
yum install -y yum-utils php74-php.x86_64
yum install -y php74-php-fpm.x86_64
yum install -y php74-php-pecl-zip.x86_64
yum install -y php74-php-opcache.x86_64
yum install -y php74-php-gd.x86_64
yum install -y php74-php-pecl-yaf.x86_64
yum install -y php74-php-xmlrpc.x86_64 php74-php-xml.x86_64 php74-php-pecl-xmldiff.x86_64
yum install -y php74-php-pecl-xhprof.x86_64
yum install -y php74-php-pecl-msgpack.x86_64
yum install -y php74-php-bcmath.x86_64
yum install -y php74-php-gmp.x86_64
yum install -y php74-php-mbstring.x86_64
yum install -y php74-php-pecl-mcrypt.x86_64
yum install -y php74-php-mysqlnd.x86_64
yum install -y php74-php-soap.x86_64
yum install -y php74-php-sodium.x86_64
yum install -y php74-php-pecl-amqp.x86_64
yum install -y php74-php-pecl-mongodb.x86_64
yum install -y php74-php-pecl-redis4.x86_64 php74-php-pecl-redis5.x86_64
yum install -y php74-php-process.x86_64
yum install -y php74-php-pecl-swoole4.x86_64
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 3,配置说明
注意使用如上方式安装 PHP 之后,一些配置目录与我们往常使用习惯略有不同,这里简作说明:
- 安装目录:
/opt/remi/php74
- 配置文件目录:
/etc/opt/remi/php74/
- 运行时目录:
/var/opt/remi/php74/
- 二进制路径:
/usr/bin/php74
- 依赖目录:
/opt/remi/php74/root/lib64/php/modules/
- 依赖配置文件:
/etc/opt/remi/php74/php.d/
- 启动管理文件:
/usr/lib/systemd/system/php74-php-fpm.service
安装之后按照往常使用习惯,我们将做一些调整:
# 将配置文件软链到/usr/local
ln -snf /etc/opt/remi/php74 /usr/local/php74
# 将PHP二进制命令调整成php
ln -snf /usr/bin/php74 /usr/bin/php
# 将启动文件名字进行调整
mv /usr/lib/systemd/system/php74-php-fpm.service /usr/lib/systemd/system/php74-fpm.service
2
3
4
5
6
然后是针对主配置文件www.conf
的一些调整,这个就每个公司各有不同,根据自己的需求来调整即可。
- 不过如果要使用默认配置的话,注意默认配置文件中,PHP 使用 apach 用户启动的。
- 因为我这边老版本差距不大,因此直接将老 PHP 的 www.conf,php-fpm.conf 覆盖掉新的,然后直接重启即可。
# 4,问题记录
问题一:如何往 PHP 里添加变量?
使用过程中,发现了一个奇怪的问题,我们有一个需求是打印日志会通过读取一个变量进行环境区分:
env[NAMESPACE]=prod
以往的姿势是将该配置放到:/usr/local/php74/php-fpm.conf
,但是现在放到里边总是报错:Array are not allowed in the global section
,后来发现需要放到 /usr/local/php74/php-fpm.d/www.conf
,然后再重启就可以了。
问题二:如何安装指定小版本的 PHP?
目前经试验发现只能安装对应大版本(比如 7.3 或者 7.4)的最新的小版本,而不能指定小版本安装,比如 7.4.15 等,如果你有安装指定小版本的版本,欢迎在评论区进行分享!