在CentOS 7 / Debian 11中源码编译php 7.4.32
Table of Contents
GNU通用编译方法
关于编译
C/C++语言编写的程序,源码编译都是用make
命令编译,然后用make install
命令安装,但关键是在编译之前需要生成一个“Makefile”文件,然后make
命令才能根据这个Makefile来编译,目前生成Makefile的方法有两种:
- 1、AutoTools方式:如果源码中有
configure
文件,那就代表用的是AutoTools(包含autoconf
,automake
,libtool
)方式,configure
文件就是编写程序的人用autoconf
和automake
这两个工具生成的,我们执行./configure
即可生成Makefile,当然configure也是有很多参数的,你可以执行./configure --help
来查找有哪些参数,结合程序官方文档或网上资料,给定你需要的参数再来执行configure命令,一般来说会有一个--prefix=/path/to/xxx/
用于指定把编译好的程序安装到哪个文件夹中; - 2、cmake方式:cmake会根据源码包中的CMakeLists.txt文件生成Makefile(换句话说如果你看到源码包里有“CMakeLists.txt”文件就说明需要用cmake来编译了)。
以上两种方式,无论是哪种,都需要gcc
(C语言编译器,是GNU Compiler Collection的缩写,中文翻译GNU编译器集合),如果你的程序是C++写的,还需要g++
(C++编译器),并且还需要pkg-config
(用于自动给编译器添加合适的编译选项)。
下载php源码包并解压
- 1、进入php官网,一眼就能看到一个大大的Download,就能进入下载页面,找到对应版本下载即可(也可右击复制链接,用wget下载)
不管哪个版本,它都有三个格式的压缩包,不管哪个都是一样的,只是压缩格式不一样,它的体积不一样,其中tar.zx格式压缩率最大(所以文件最小),tar.bz2次之,tar.gz压缩率最小(所以文件最大),理论上文件小下载能稍微快点,但最大的也才16M左右,所以其实体现不出什么差别wget https://www.php.net/distributions/php-7.4.32.tar.gz
- 2、如果你要下载的版本比较老,可以点击Download页面右侧的Old archives,然后找到对应的版本来下载;
- 3、解压源码包(以下分别为三种压缩格式的解压方法)
tar -vzxf php-7.4.32.tar.gz tar -vjxf php-7.4.32.tar.bz2 tar -vxf php-7.4.32.tar.xz
configure文件的作用
进入前面解压好的源码包文件夹,用ls -l
命令查看文件,你会发现里面有一个configure
文件,所以编译php是使用configure的方式生成Makefile文件的(而不是使用cmake,而如果是mysql的话就是用cmake的),以下为configure文件的作用:
- 指定编译选项(如
--prefix=/usr/local/php
指定安装到哪个位置); - 检查依赖(缺少就会报错,一般报错后你都能在最后看到
configure: error
的字样); - 生成
MakeFile
文件。
比如缺少gcc
的报错
configure: error: no acceptable C compiler found in $PATH
编译php缺少libxml2
的报错
configure: error: libxml2 not found. Please check your libxml2 installation.
所以我们需要事先安装它依赖的包,这样才不会报错,而且一般使用包管理工具安装就行(centos7是yum,debian11是apt),当然碰到有些用包管理工具安装不了所需版本的,就需要去下载源码包安装了。
那怎样知道要安装哪些依赖呢?其实你configure后面跟了什么参数,就代表需要那个包,只不过有时候你也不知道那个包有没有安装过,而且可能也不知道它对应的包名,因为有时候包名未必跟configure参数中的名称一样,这个只能靠经验以及网上查资料(如网友写的文章),否则就只能它报错的时候少什么你再安装什么(一般是直接把报错的那段内容百度或google找解决方法)。
编译php
编译前准备
进入前面解压好的php源码文件夹(不要复制我的,版本不同文件夹名也不同)
cd php-7.4.32
运行以下命令查看有什么编译选项,由于内容太多我就不贴出来了,大家自己执行自己看就行
./configure -h
如何选择编译选项
看了./configure --help
输出的编译选项,这么多选项,你会有一头雾水,不知道要用哪些编译选项,根本无从下手的感觉。
而且php非常多依赖包,你也不知道要用什么依赖包,最快的方法是去网上找手动编译的教程,一般都会说要用哪些依赖包,然后就只能靠平时每次编译遇到问题不断总结经验了,编译的次数越多,经验越丰富,一定要把过程记录下来,不然久了会忘,而且也不可能长时间记住这么多复杂的参数,毕竟编译这种事并不会经常做。
有些依赖包可以用包管理工具安装,比如rehat/centos的yum
,debian/ubuntu
的apt
或apt-get
,但有时候包管理工具中发布的未必能跟上最新,如果包管理工具中的不够新而你又要用到新的,那就只能源码编译了。而且Rehat系的包名经常跟Debian系不同,比如zlib
(用于支持gzip压缩),在redhat系的系统中是zlib zlib-devel
,而在debian系的系统中却是zlib1g zlib1g-dev
。
对于Redhat系的-devel
包以及Debian系的-dev
包,无论是“devel”还是“dev”,都是“develop”的意思,develop指的是“开发包”,这种版本中,包含了“运行库和头文件”,当一个程序需要依赖另一个程序时(比如php需要调用zlib的功能),在编译的时候,就必须要包含这些“运行库和头文件”才能调用它的接口,这也是为什么我们在使用yum
和apt
等包管理工具安装zlib时,需要安装两个,一个是这个程序本身(已经编译好的),另一个是它的运行库和头文件(即带-devel
或-dev
结尾的)。而如果你的zlib是源码编译,那就不存在-devel
版本的概念,因为源码中本来就包含运行库和头文件,包管理工具只不过是把这两个分开了而已(因为如果你只是要单独使用zlib,不需要被其它程序依赖的话,是不需要用到运行库和头文件这些原始代码的)。
编译选项虽然很多,但可分为三大类:
- 1、SAPI modules: SAPI为Server Application Programming Interface. 应用程序编程接口(主要用于与其它程序交互,比如Nginx/Apache等Http服务器需要通过FastCGI这个SAPI来与php交互);
- 2、General settings: 通用设置,主要用于指定配置文件路径,其它选项可以不管;
- 3、Extensions: PHP扩展,分为内置扩展和外部扩展,内置扩展用
--enable-
或--disable-
开头,而外部扩展则用--with-
或--without-
开头。
Extensions分为内置和外置:
– 1、内置扩展:--enable-
开头的选项表示默认是关闭的,使用了--enable-
开头的选项就表示开启它(如果你不写这个选项,那么它就是关闭的),而--disable-
开头的表示默认是开启的,如果你要关闭,那么就使用--disable-
开头的选项(如果你不写这个选项,那么它就是开启的。)
– 2、外部扩展:非php源码内置,需要你自己先在系统中安装,大多数可使用系统包管理工具安装(比如yum/apt等等),当然包管理工具有可能版本不够新(或者太新了),这时你就要源码安装你需要的版本。--with-
开头的选项表示默认不会编译该扩展,要手动添加该选项才会编译,而--without-
开头的选项,会默认被编译,你果你不想它被编译,就使用--without-
取消这个默认编译。有人可能会问,既然默认会编译,那为什么不直接用--enable-
呢?之所以用--with-
而不用--enable-
是因为该扩展对应的库不是php单独的,而是公用的,比如zlib(压缩库),并不是只有php才能用,其它程序只要用到压缩功能的,都可以用,它只需要在系统安装一份即可,对于这种公共的库,php没必要内置,只要不是内置的,都是用--with-
而不是--enable-
。--with-
有时候需要指定扩展路径,有时候会自动搜索,这个看具体情况。
SAPI模块编译选项
1、--with-apxs2[=FILE]
apxs是APache eXtenSion tool,用于给Apache服务器构建及安装扩展。Http服务器(Nginx,Apache等)需要调用php来解析php,Nginx是使用FastCGI方式,而对于Apache来说,除了可以通过FastCGI方式,还可以通过模块的方式调用(即把php当成Apache的一个模块),而--with-apxs2
就是用于指定Apache的apxs路径的,因为只有通过apxs才能编译出apache能使用的模块文件(对于Linux来说是.so
的文件),见这里。
2、--disable-cli
php有三个不同接口的解析器,/usr/local/php/bin/
下有两个,分别是php
(win下为php.exe
)和php-cgi
(win下为php-cgi.exe
),/usr/local/php/sbin/
下有一个php-fpm
(win没有),其中php
(winphp.exe
)就是命令行版的php,而php-cgi
(winphp-cgi.exe
)和php-fpm
(win没有)则是使用FastCGI接口的。
--disable-cli
意思就是不编译下图中的php
(在win中叫php.exe
)这个命令行版本的php解析器,但这个命令行版本偶尔还是需要用到的,所以这个选项不要用(即不要禁止生成php
这个可执行文件)
3、--enable-embed[=TYPE]
允许构建内嵌的SAPI,该SAPI主要是让其它语言调用php函数。TYPE
的值有shared
(共享链接库)和static
(静态链接库)两种。编译后在php目录下的/lib/
目录下会有库文件,并且在php目录下的/include/php/sapi/
目录下会有一个.h
后缀的c语言头文件php_embed.h
,在C代码中调用php函数
4、--enable-fpm
允许构建php-fpm
可执行文件。这个是php最重要也是最常用的进程管理器,所以这个选项必须要。
5、--with-fpm-user
和--with-fpm-group
这两个是一组,表示指定使用哪个用户和组来启动php-fpm
(其实就是在配置文件里生成配置,我们后续也是可以在配置文件修改的)。
6、--with-fpm-systemd
systemd是当前绝大部分Linux系统默认采用的初始化系统,在这之前的初始化系统叫Sysvinit,所以这个选项肯定要启用,但是如果你是在docker中编译,那么该选项就不要启用,因为docker中不依赖systemd启动,docker的容器是dockerd管理的,而dockerd本身已经是使用systemd启动了。
7、--with-fpm-acl
acl是Access Control List,访问控制列表,对Linux稍微熟悉点的朋友应该知道,Linux控制一个用户有没有权限访问一个文件,是通过用户权限和组权限来实现的,但在这之外,还有一个acl权限(setfacl,getfacl两个命令),而这个--with-fpm-acl
选项我觉得应该就是用来做这个相关的,但具体怎么使用我不太清楚,网上找了也没有这方面讲的比较清晰的资料。
8、--enable-litespeed
litespeed是一个类似Apache并可以代替Apache的Web服务器,该选项是把php编译成litespeed的一个模块。如果你使用litespeed服务器,那就要开启,否则不开启。
9、--enable-phpdbg
dbg是debug(调试)的缩写,phpdbg就是php调试工具。如果使用该选项,编译后,在/usr/local/php/bin/
中会有一个phpdbg
可执行文件,这是php的debug工具。
10、--enable-phpdbg-webhelper
这是与phpdbg相关的,webhelper一看就知道意思,网页助手,意思就是可以让你通过网页来调试php。
11、--enable-phpdbg-debug
在调试模式下建构phpdbg,也是debug相关的。
12、--enable-phpdbg-readline
readline是一个开源的用于读取用户输入的命令行的库,允许这个选项意思就是让你可以通过命令行的方式来调试php。
13、--disable-cgi
在/usr/local/php/bin/
下会有一个php-cgi
的可执行文件,如果使用了该选项,那么就会没有这个文件,事实上这个文件已经是历史遗留,现在都用php-fpm
,不会再用php-cgi
,具体见这里。
--with-valgrind
valgrind是一个内存调试工具,使用这个选项意思就是构建valgrind内存调试工具,然后你就可以使用valgrind来调试php的内存使用情况等,一般不需要。
通用设置编译选项
这里我只挑了两个选项,其它的一般用不到就没写出来。
--with-config-file-path=PATH
指定配置文件路径,即php读取php.ini
的路径
--with-config-file-scan-dir=PATH
指定php扫描配置文件的目录,这个目录一般用来放“子配置”,比如你安装了一个扩展,那么这个扩展单独写一个配置文件,这样就不需要去修改php.ini
,因为单独文件方便管理,删除扩展时程序自动删除这个配置文件就行,但如果是写在php.ini
里面,那么程序很可能是无法删除的(虽然其实用sed
也可以),但还是没有直接删除一个文件来的直接。目录名称一般用.d
结尾(表示它是directory,即目录),比如conf.d
或php.d
(因为另外还有php-fpm.d
)。
扩展编译选项(数据库相关)
./configure -h
中的选项并不是按分类来排列的,比如数据库相关选项很多都分散了,这不方便我们查阅和使用,因为数据库相关的扩展选项非常多,所以我就把这些选项集中在一起。
--enable-mysqlnd
显式启用mysqlnd(mysql驱动),如果没有该选项,它有可能会被隐式启用(比如当它被其它扩展依赖时)。
--disable-mysqlnd-compression-support
禁用mysqlnd压缩协议支持。这个压缩协议是mysql自己的协议,用于在客户端与服务器之间数据传递时,压缩数据,以减少数据的传输,至于是否能加快速度,这个要看情况,因为压缩也需要占用比较多的cpu,但只要cpu不是太差,一般都能加速。而该选项就是禁用这个压缩协议,一般来说,不需要去禁用。
--with-mysqli[=FILE]
php的mysql扩展,i表示improvement(增强版),mysqli相关函数需要用到此扩展,但现在操作数据库基本用pdo,mysqli比较少用。FILE
表示mysql的配置文件路径,如果不传此参数或者传“mysqlnd”,则mysql原生驱动(即mysqlnd,mysql native driver)会被采用。虽然说现在都用pdo,但该选项一般不要去禁用它,万一什么时候测试的时候用的到呢?
--with-mysql-sock[=SOCKPATH]
mysql启动后,会有一个.sock
文件(unix socket文件),这里指的就是该文件的路径,如果不指定,它会去搜索默认的路径,一般不用去指定它。
--with-oci8[=DIR]
oci是Oracle Call Interface的缩写,该接口可让C/C++程序直接访问Oracle数据库,php的oci8相关函数需要该扩展的支持,但一般都用不到,如果你自己用的到oracle数据库,则需要使用这个选项。
--with-odbcver[=HEX]
ODBC是Open Database Connectivity的缩写,是一个开放的数据库连接驱动,odbcver中的ver代表“version”,即版本,该选项用于强制支持指定的ODBC版本,但对于php,操作数据库一般都用pdo比较多,所以这个应该也是不怎么用的,该选项可以不要。
--with-adabas[=DIR]
Adabas是一种关系型数据库,该选项用于支持Adabas D数据库,一般来说这个选项是不需要的,除非你要用到这种数据库。
--with-sapdb[=DIR]
sapdb是一种数据库,据说是一种可以自组装的数据库,SAP是Self Assembling Peptides的缩写,我们一般用不到。
--with-solid[=DIR]
solid应该是指SolidDB,因为这一段全都是数据库相关配置,它在这里肯定是数据库相关的,但我从来没用过这数据库也没听过,甚至都不确定它是不是指soliddb,但我想绝大多数人是用不到这个选项的。
--with-ibm-db2[=DIR]
用于支持ibm的db2数据库,DIR默认是[/home/db2inst1/sqllib]。
--with-empress[=DIR]
用于支持Empress,Empress Embedded Database,一种嵌入式数据库。
--with-empress-bcs[=DIR]
用于支持Empress本地访问(具体是怎样我也不清楚,如果你用的到这个数据库,应该会知道)。
--with-custom-odbc[=DIR]
用于支持用户自定义的ODBC(通用数据库连接驱动)。
--with-iodbc
用于支持iODBC,是一个平台无关的ODBC软件开发套件和运行环境,能够提供ODBC兼容性的程序开发并能够驱动外部的Windows平台。
--with-esoob[=DIR]
es是Easysoft,OOB是ODBC-ODBC Bridge,也是ODBC相关的,具体我也不知道干嘛的,可以看一下这里:Easysoft ODBC-ODBC Bridge User Guide – Configuration。
--with-unixODBC
unixODBC也是ODBC相关的东西,unixODBC旨在建立非windows系系统之间的ODBC标准。
--with-dbmaker[=DIR]
用于支持DBMaker。DBMaker是台湾凌群电脑出品的内置ODBC支持的数据库。
扩展编译选项(gd相关)
--enable-gd
gd最初是“GIF Draw”的缩写,但后来被非正式的认为是“Graphics Draw”的缩写。这是一个开源的图片处理库,叫libgd,毫无疑问,这个选项是必须的,php所有图片处理相关函数都需要该扩展。
--with-external-gd
使用外部的libgd,我估计是因为有可能php内置版本不符合你的需要,所以你可以自己去下载你需要的libgd版本来编译,一般用不到外部的,所以这个选项只有你需要用自问libgd的时候才用。
--with-webp
启用webp格式图片支持(webp是一种图片格式,具有体积小的特点,方便在网络上使用,比如淘宝的图片现在都是webp的),该选项仅用于内置的gd库,如果你使用外部的gd,这个选项是无效的。
--with-jpeg
启用jpeg格式图片支持,jpeg图片是最常见的格式,所以该选项肯定要用,同理,仅用于内置的gd库。
--with-xpm
启用xpm格式图片支持,同理,仅用于内置的gd库。注:XPM是”X PixMap“,用于X Window(Linux/Unix类的系统使用的可视化视窗)。
--with-freetype
freetype是一个免费的文字渲染库(字体引擎),比如你想用php在图片上添加文字,并且希望文字的字体是你指定的字体,那么此时就是靠freetype来渲染这个字体的。
--enable-gd-jis-conv
jis是Japanese Industrial Standard(日本工业标准),是日语的一种编码标准。因为它是带-gd
的,所以也是图片处理相关的,只不过是用于日语的字体之类的,具体我不是很了解,不过它也只能用于php内置的gd库,这个建议要用,万一需要在图片中写日语文字呢。
扩展编译选项(其它)
--disable-all
php默认开启很多扩展,如果使用这个选项,则会关闭所有默认开启的扩展。
--without-libxml
不编译libxml
,这个选项肯定不能用,因为处理xml是最基本的功能,是必须要的。
--with-openssl[=DIR]
./configure --help
里,并没有[=DIR]
,openssl是网络通讯安全协议,这是必须的,php的openssl相关函数都需要该扩展。
--with-kerberos
kerberos是一个网络认证协议,开启该选项会让openssl具有kerberos协议相关功能,如果你需要用到,那么就开启。
--with-system-ciphers
openssl相关的设置,使用系统默认密码列表代替硬编码。
--with-external-pcre
使用外部正则表达式库来支持正则表达式。
--with-pcre-jit
启用pcre jit(Just-in-Time,即时编译)功能,jit是用于加速的,建议开启,其中pcre是perl compatible regular expressions,即“Perl兼容的正则表达式” 。
--without-sqlite3
不要sqlite3支持。Sqlite3有时候还是可能用到的,这个选项最好不要使用,即默认会支持sqlite3。
--with-zlib
zlib是开源的压缩库,这是必须的,php有很多zlib相关函数需要zlib的支持。
--enable-bcmath
bc是basic calculator(基本计算器)的缩写,bcmath是用于任意精度的基本数学计算的。我们知道,对于浮点数(也就是小数),直接使用+
/-
/⨉
/÷
等符号来计算,会导致结果不准确,但是利用bcmach函数就不会有这个问题,所以这个选项是一定要开启的。
--with-bz2
这是bz2压缩格式,比如我们的php源码包,就有.tar.gz
和.tar.bz2
格式,bz2格式压缩比大一点,所以用它压缩的文件体积会小一点,这也是必须要支持的,所以这个选项一定要。
--enable-calendar
calendar是日历的意思,php的日历相关函数需要该扩展的支持。
--disable-ctype
c是character(字符)的意思,ctype是C语言标准库头文件(ctype.h),该头文件中的函数用于测试和映射字符。当传入整数作为参数时,这些函数的行为和C语言的ctype.h中的对应函数一样。这个选项一般不要禁用它,属于php的一个基本功能。
--with-curl
curl中的c是command line(命令行)的第一个字母,全称是“command line tool and library for transferring data with URLs”,意思是使用命令行的方式来通过url传输数据(非命令行方式就是使用浏览器的),这是所有后台编程语言都必须具有的功能,所以这个选项是必须要的,否则就失去了与网络交互的功能。
--disable-dom
php DOM相关函数需要该功能的支持,默认开启,这个选项一般不要去用,因为万一你用到这个功能呢?
--with-enchant
enchant是一个拼写检查工具,用于检查一个单词是否正确拼写,php中的Enchant相关函数需要该扩展的支持,如果你需要这个功能,那就加一这个选项。
--enable-exif
exif是Exchangeable Image File Format,简称exif。exif用于存储图片信息(比如图片是什么时候,在哪,用什么设备拍摄的,以及照片的光圈,快门等参数),php的exif相关函数需要该扩展的支持,这是图片处理常用的功能,强烈建议启用。
--with-ffi
FFI是Foreign Function Interface(外部函数接口),用于允许php直接调用C语言函数。
--disable-fileinfo
用于获取一个文件的相关信息,php的fileinfo相关函数需要该扩展的支持,最常用的mime_content_type()
函数就需要该扩展的支持,所以这个禁用选项是不能用的。
--disable-filter
php的过滤器函数需要用到,一般都不要关闭它,因为万一你需要用到这些函数呢?
--enable-ftp
php的ftp相关函数要使用该扩展,如果你有可能使用ftp相关函数,那么就要加上该选项。
--with-openssl-dir
当没有使用--with-openssl
选项时,使用--with-openssl-dir
指定openssl安装目录,可以单独让ftp支持openssl。但这个选项基本上用不到,因为--with-openssl
是必须要用的。
--with-gettext[=DIR]
gettext用于国际化与字符编码支持,php的Gettext相关函数需要用到,一般建议使用。关于国际化的支持,php支持很多种方案,具体见这里。
--with-gmp[=DIR]
GMP是The GNU Multiple Precision Arithmetic Library,简称GMP或GMPAL,是一个开源的数学运算库,它可以用于任意精度的数学运算,包括有符号整数、有理数和浮点数。它本身并没有精度限制,只取决于机器的硬件情况。php的gmp相关函数需要依赖该扩展。注:bcmath也是用于浮点运算的,具体区别我还不知道。
--with-mhash
mhash是一个免费的库,它用于为大量的哈希算法提供一个统一的接口,php的Mhash相关函数需要该扩展的支持。
--without-iconv[=DIR]
iconv是一个编码转换库,编码转换非常常用,所以这个选项肯定不能用,因为php的iconv编码转换相关函数都需要使用该扩展。
--with-imap[=DIR]
imap是邮件接收协议(发送协议是smtp),其实php用邮件协议更多的是发送,接收邮件协议倒是不常用,不过php的imap相关函数需要该扩展,如果你需要用php来写接收邮件功能,那么就要安装这个,并且还要先安装imap服务器,[=DIR]就是imap服务器的prefix路径。
--with-imap-ssl
给imap增加ssl支持。
--with-kerberos
kerberos是一个网络认证协议,开启该选项会让openssl具有kerberos协议相关功能,如果你需要用到,那么就开启(这个选项在前面已经有介绍,只不过这里再次提起,因为这里提到imap-ssl,事实这个选项用一次就可以,好吧我是猜的,但按道理来说同一个选项不应该要重复)。
--enable-intl
intl是internationalization的缩写,它是国际化的意思,因为这单词太长了,有20个字母,为了方便,一般都省略中间18个字母,并用数字18来表示中间有18个字母,即写成i18n。php的的字符校对类“Collator”需要用到该扩展。
--disable-json
写接口最常用的就是json_encode()
和json_decode()
函数,如果你要使用这两个函数,那么就不要禁用这个扩展,事实上这两个函数极为常用,所以这个选项肯定不能用。
--with-ldap[=DIR]
LDAP是Lightweight Directory Access Protocol,轻量级目录访问协议,一种网络文件夹访问协议,这个一般都要,否则你就无法使用ladp相关函数。
--with-ldap-sasl
让LDAP支持Cyrus SASL,SASL是Simple Authentication and Security Layer,就是让你的LDAP更安全的东西。
--enable-mbstring
mb是mutibyte(多字节),mbstring一般用于处理字符串编码相关的,比如我要截取一个字符串,如果用substr是只会按字节截取的,这样就截不了中文,但是用mbstring就可以,php的mbstring相关函数需要用到该扩展。
--disable-mbregex
mbstring相关函数中,函数名带ereg
(extended regular expression)和regex
的会受此影响,ereg是扩展正则,而regex应该是perl正则,具体是只会导致带regex
的函数无法使用,还是带ereg
的函数也会无法使用呢?这个我没有测试。
--disable-opcache
OPcache通过将PHP脚本预编译的字节码存储到共享内存中来提升PHP的性能,存储预编译字节码的好处就是省去了每次加载和解析PHP脚本的开销。opcache是提升php性能用的,不能禁用。另外也有opcache相关函数需要使用到该扩展。
--disable-huge-code-pages
程序运行的时候是存储在内存中的,它被分为一个一个的小块,叫“页”(即page),默认的内存是以4KB分页的,而虚拟地址和内存地址是需要转换的,而这个转换是要查表的,CPU为了加速这个查表过程都会内建TLB(Translation Lookaside Buffer),显而易见如果虚拟页越小,表里的条目数也就越多(就像分一个蛋糕,你切的越小块,那么块数就越多),而TLB大小是有限的,条目数越多TLB的Cache Miss也就会越高(cpu查找内存数据,命中了叫hit,反之叫miss), 所以如果我们能启用大内存页就能间接降低这个TLB Cache Miss,进而加快速度,由于这个选项是禁用大内存页,所以我们不要使用该选项。
--enable-pcntl
p是process,cntl是control,合起来就是process control,即进程控制,该扩展用于在php中实现unix风格的进程创建、程序执行、信号控制以及进程终结等操作。由于php-fpm本身就已经实现了unix风格的进程控制,所以该扩展主要用于php命令行及php-cgi,php中的pcntl相关函数需要本扩展的支持,这些进程控制函数不能用于web服务器环境中,否则将会出现意外的结果(unexpected result),但php绝大多数时候又是用于web服务器环境,所以这个功能理论上应该是用不到的,如果你很确定你会用到,那么就开启一下,否则可以不用开启。
--disable-phar
phar是Php ARchive(归档)的缩写,意思是把写好的php程序(可能是一个文件夹下有很多文件或子目录)打包成一个.phar
文件,这个虽然我们很少用,但一般不要去禁用它。Phar类中的方法都要依赖于该扩展。
--disable-posix
该选项用于关闭posix扩展(默认是开启的),如果使用该选项,则php的posix相关函数都无法使用。POSI是Portable Operating System Interface的缩写(X表示Unix),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945,X代表它是对Unix接口的继承。
--with-pspell[=DIR]
pspell是用于拼写检查的工具,该选项用于启用psspell扩展,让php支持拼写检查,如果不启用该扩展,则php的psspell相关函数将无法使用。
--with-libedit
用于替换readine,仅用于命令行和CGI,与php-fpm无关。
libedit是NetBSD(一个类Unix操作系统)的内置读取命令行的库,其功能与readline类似,这是libedit源码。
--with-readline[=DIR]
用于支持readine,就是命令行读取参数之类的功能(仅用于命令行和CGI),与php-fpm无关。
--disable-session
禁用session功能。cookie和session是用于保持会话状态的技术,这些都是作为一门服务器端语言的基本功能,所以session肯定不能禁用。
--with-mm[=DIR]
用于提升session性能,可以让session把数据存到共享内存中(默认是存在文件里),这样就不会让session的读取速度受限于磁盘读写速度了。关于共享内存,可查看这里。
--enable-shmop
让php能操作unix系列系统的共享内存(shmop是shared memory operation的缩写),开启后,php的shmop相关函数就可以使用了。
--disable-simplexml
禁用simplexml扩展(默认是开启的),禁用后,SimpleXMLElement这个类的相关方法将无法使用,simplexml主要用于处理xml格式数据,比如微信公众号的开发就是用的xml格式数据。处理xml数据属于一门服务器端编程语言的基本功能,不建议禁用。
--with-snmp[=DIR]
snmp是Simple Network Management System的缩写,中文叫“简单网络管理协议”。snmp是专门设计用于在IP网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。启用此扩展,则php可以使用SNMP相关函数。
--enable-soap
SOAP是Simple Object Access Protocol,简单对象访问协议。简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议,它被设计成在WEB上交换结构化的和固化的信息。php的SoapClient类依赖于此扩展。
--enable-sockets
让php支持socket协议,这个肯定是要的。如果不启用该选项,则php的Socket相关函数都会无法使用。
--with-sodium
sodium本义是化学元素“钠”。但编程界的sodium是指libsodium,是一个用于加解密、签名、对密码做哈希等的现代化的,易于使用的库。启用后,php将会增加这些sodium相关函数。
--with-password-argon2[=DIR]
argon2是获得PHC(Password Hashing Competition,密码哈希竞赛)冠军的密码哈希函数,添加该扩展可让php支持该密码算法。
--enable-sysvmsg
启用System V消息队列
--enable-sysvsem
启用System V信号量
--enable-sysvshm
启用System V共享内存
不过说实话,启用了之后具体怎么用,我也不知道。。。
System V IPC一共有三种类型的IPC合称为System V IPC:
- System V信号量(即
--enable-sysvsem
) - System V消息队列(即
--enable-sysvmsg
) - System V共享内存(即
--enable-sysvsem
)
--with-tidy[=DIR]
启用TIDY支持(用于处理html的),这是php的TIDY类,该扩展要求本机已安装tidy,一般类Unix系统都自带tidy工具。
Tidy是HTML处理工具中的老牌(爷爷级)工具,这是它的官网。
--disable-tokenizer
禁用tokenizer。PhpToken类会用到该扩展,禁用了就没这个类了。
--disable-xml
禁用xml支持,这个肯定不能禁用。
--with-expat
XML默认使用libxml2库,该选项可用expat代替libxml2库。
Expat是一个用C编写开源的面向流的XML解析器库,这是它的Github。
--disable-xmlreader
禁用xmlreader。当xml很长,节点很多的时候,如果整个读入,这样比较费磁盘I/O和内存,而xmlreader可以一点一点的读。
--disable-xmlwriter
跟xmlreader是一对,只不过它是写入。
--with-xmlrpc[=DIR]
启用XMLRPC-EPI支持。XMLRPC-EPI是xmlrpc协议的C实现。启用后,php将会增加这些函数。
--with-expat
用expat代替libxml2(作为xmlrpc的依赖),该选项前面已经出现过一次,这里又出现一次,我觉得如果前面写了这里可以不用写。
--with-iconv-dir=DIR
iconv是转换编码用的(作为xmlrpc的依赖)
--with-xsl
添加xls支持。xsl。
XSLT是XSL Transformations的意思,是一种语言,用于把一种XML文档转成另一种XML文档。
XSL是eXtensible Stylesheet Language,可扩展样式语言,XSL与XML的关系,就跟CSS与HTML的关系一样,用于控制XML样式。所以XSL就是XML的css样式表。
--enable-zend-test
启用zend-test模块,测试php代码的,具体我也没用过,但实际使用环境肯定不用这个。
--with-zip
用于支持zip压缩,比如要用php解压.zip
压缩包,一般是需要的。
--with-pear
pear是PHP Extension and Application Repository的缩写。composer大家应该都知道吧?这个就是在composer出来之前用的包管理工具,后来composer出来就被composer代替了。但是并不是说pear就没有用了,pear后来有个子项目叫pecl,pecl是专门用于安装扩展用的(即安装不是用php写的库,而是用C语言编译的扩展),如果你要使用pecl来安装php扩展,那么就需要安装pear,安装后它会同时有pear
和pecl
两个命令,所以,虽然pear被composer代替了,如果你需要使用pecl
来安装php扩展,则需要启用该选项,具体可以看:PHP的三种工具pecl/pear/composer的区别及基本使用。当然你也可以不用该选项,这样如果你要安装扩展,那就要手动编译了。
需要安装的依赖
libxml2
php核心功能中的DOM, libxml, SimpleXML, SOAP, WDDX, XSL, XML, XMLReader, XMLRPC和XMLWriter需要用到libxml2
。
openssl
php核心功能中的openssl相关函数需要用到,openssl主要用于安全加密通讯。
bzip2
用于支持bzip2压缩解压相关函数,例如.tar.bz2
后缀的压缩包,就需要用到bzip2。
libcurl
用于支持php核心功能中的curl相关函数,curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。
libjpeg
php的gd库处理jpeg图片需要依赖libjpeg
。
libpng
php的gd库处理png图片需要依赖libpng
。
freetype
php的gd库把文字变成图片(比如生成验证码)时需要依赖freetype
。
gmp
GMP是The GNU Multiple Precision Arithmetic Library,简称GMP或GMPAL,是一个开源的数学运算库,它可以用于任意精度的数学运算,包括有符号整数、有理数和浮点数。它本身并没有精度限制,只取决于机器的硬件情况。php的gmp相关函数需要依赖gmp
,php的gmp相关函数主要是做数学运算用的。
libmcrypt
php的常用算法相关函数需要依赖libmcrypt
。
readline
php的readline相关函数需要依赖readline
函数,这个在web编程上用不到,是直接写php命令脚本时用的。
libxslt
Libxslt是一个基于libxml2的,为GNOME项目开发的XSLT C库。php的XSLT相关函数需要依赖libxslt
。
XSLT是XSL Transformations的意思,是一种语言,用于把一种XML文档转成另一种XML文档。
XSL是eXtensible Stylesheet Language,可扩展样式语言,XSL与CSS在很多功能上是重复的,但是它比CSS功能更强大。CSS用于HTML,而XSL用于XML。
configure编译参数选择
结合上边的选择adto,以下是我选择的编译选项:
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--enable-gd \
--with-webp \
--with-jpeg \
--with-freetype \
--enable-gd-jis-conv \
--with-pcre-jit \
--with-zlib \
--enable-bcmath \
--with-bz2 \
--enable-calendar \
--with-curl \
--enable-exif \
--with-gettext \
--with-gmp \
--with-mhash \
--enable-intl \
--enable-mbstring \
--enable-sockets \
--with-sodium \
--with-zip \
--with-pear
# 如果在docker中编译,则不要启用systemd,因为docker中不需要用systemd来启动php-fpm
# --with-fpm-systemd \
# enchant和tidy怎么安装dev包都没用,估计要编译才行了。
注:反斜杠\
的意思是:本质上这些选项其实都是在一行上的,但是为了让我们人方便看一行一个选项,就在行尾添加了反斜杠,你可以认为是软换行(就是让人眼看起来是换行,但是程序不会认为换行了)
以上./configgure
命令直接执行肯定会报错,因为它后面跟了那么多选项,所以你必须先安装这些选项对应的包,这些包我们用包管理工具安装即可,在debian 11中用apt安装,在centos7中用yum安装。
至于具体要安装哪些,就得靠经验和网上资料了,不然就直接看报错,它报哪个错,你就解决装哪个(但是由于报错的包名,未必就是可以直接用apt或yum安装的包名,此时你只能搜索报错信息对应在debian中的包名和在centos7中的包名)。
当所有依赖都安装完,当运行./configure
命令不报错时,它最后会输出以下内容,这就表示依赖环境都准备好了,可以编译和安装了
+--------------------------------------------------------------------+
| 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.
在Debian 11中安装依赖
debian 11(bullseye)中安装php7.4.32需要的依赖,依赖一般在这里搜索
# 先更新一下apt库,不然你后面install可能都不成功
apt update
# gcc编译器是必须的,不然你就无法编译源码了
apt install -y gcc
# 我们在编译、链接的第三方库时,必须指定这些第三方库的头文件和库文件的位置。对于一个比较大第三方库,其头文件和库文件的数量是比较多的,
# 如果我们一个个手动地写,那会相当麻烦。所以,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。
apt install -y pkg-config
# php中的libxml, SimpleXML, SOAP, WDDX, XSL, XML, XMLReader, XMLRPC和XMLWriter需要用到libxml2
apt install -y libxml2 libxml2-dev
# sqlite3是默认需要支持的,除非你使用了--without-sqlite3选项,则不会需要sqlite3相关库
apt install -y sqlite3 libsqlite3-dev
# zlib用于让php支持压缩和解压.tar.gz的压缩包,因为我们指定了--with-zlib,所以会要求安装zlib
apt install -y zlib1g zlib1g-dev
# bz2用于压缩解压tar.bz2压缩包
apt install -y libbz2-dev
# 用于支持php的curl相关函数,curl访问https需要tls库,而目前有三种tls库:OpenSSL(默认),Network Security Services,GnuTLS,
# 它们分别对应:libcurl4-openssl-dev,libcurl4-nss-dev,libcurl4-gnutls-dev,一般来说,我们使用openssl,即安装libcurl4-openssl-dev即可
apt install -y libcurl4-openssl-dev
# png图片格式开发库
apt install -y libpng-dev
# webp图片格式开发库
apt install -y libwebp-dev
# jpeg图片格式开发库
apt install -y libjpeg-dev
# freetype用于渲染字体(比如在图片上添加水印或文字,需要指定文字的字体,而freetype就负责渲染字体)
# 目前(2022年)一般是freetype2
apt install -y libfreetype-dev
# gmp用于支持任意精度数学运算,到bcmath功能相同,但这是两个不同的库
apt install -y libgmp-dev
# libonig5是mbstring依赖的库
apt install -y libonig-dev
# 把上边的全部写在一起
apt upddate && apt install -y gcc pkg-config libxml2 libxml2-dev sqlite3 libsqlite3-dev zlib1g zlib1g-dev libbz2-dev libcurl4-openssl-dev libpng-dev libwebp-dev libwebp-dev libjpeg-dev libfreetype-dev libgmp-dev libonig-dev
在CentOS 7中安装依赖
我使用的是CentOS 7.9-2009,我是在docker中使用的这个镜像:
docker pull centos:centos7.9.2009
顺便提一嘴,如果是用的是centos:latest
,yum update
很可能报以下错,而centos:centos7.9.2009
版本运行yum update
则不会报:
Error: Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist
我们使用这个命令来解决,其实就是把baseurl前面的#
号去年
cd /etc/yum.repos.d/
# 去掉baseurl前面的井号,即取消注释
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
yum update -y
安装一下epel-release扩展库和c/c++编译器
# 安装epel库(这样能搜索到更多的包)
yum install -y epel-release
# 安装epel-release库后update一次
yum update -y
# 安装c和c++编译器
yum install -y gcc gcc-c++
安装php的依赖
# 以下都是php的依赖
yum install -y libxml2 libxml2-devel
yum install -y libsqlite3x libsqlite3x-devel
yum install -y bzip2 bzip2-devel
yum install -y libcurl libcurl-devel
yum install -y libpng libpng-devel
yum install -y libwebp libwebp-devel
yum install -y libjpeg libjpeg-devel
yum install -y freetype freetype-devel
yum install -y gmp gmp-devel
# 注意,这个icu不是医院的icu,而是International Component for Unicode的缩写,就是编码转换需要用到的库
yum install -y libicu libicu-devel
# mbstring需要用到的库,需要安装epel-release后才有
yum install -y oniguruma oniguruma-devel
# 需要安装epel-release后才有
yum install -y libsodium libsodium-devel
yum install -y libzip libzip-devel
yum install -y openssl openssl-devel
yum install -y libmcrypt libmcrypt-devel
yum install -y readline readline-devel
yum install -y libxslt libxslt-devel
# 前面所有依赖的安装命令合并成一条命令
yum install -y libxml2 libxml2-devel libsqlite3x libsqlite3x-devel bzip2 bzip2-devel libcurl libcurl-devel libpng libpng-devel libwebp libwebp-devel libjpeg libjpeg-devel freetype freetype-devel gmp gmp-devel libicu libicu-devel oniguruma oniguruma-devel libsodium libsodium-devel libzip libzip-devel openssl openssl-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel
安装完之后,我们再次执行前面的configure命令,会报以下错误
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且不等于1.3.1和1.7.0,而我们安装的是0.10.1,版本就差一点点,需要编译安装特定的libzip才行,我是直接找的我写本文时最新的版本libzip-1.9.2。
从libzip下载libzip-1.9.2
wget https://github.com/nih-at/libzip/releases/download/v1.9.2/libzip-1.9.2.tar.gz
libzip需要用cmake3编译(cmake不行,版本太低),编译命令如下
# 安装cmake3
yum install -y cmake3
# 进入libzip源码文件夹
cd libzip-1.9.2
# 在libzip源码文件夹中创建一个build文件夹
mkdir build
# 进入build文件夹
cd build
# 执行cmake3,cmake产生的文件会在当前文件夹中,而cmake的源码是当前目录
# (build)的上级目录,所以参数是“..”(表示上级目录,注意“..”后面不用加斜杠)
cmake3 ..
# 编译及安装
make && make install
# 把pkgconfig路径加入到环境变量中
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/local/lib64/pkgconfig
编译好之后,我们再来执行php的configure命令就可以了,如果还是有报错,那就解决对应报错,把有error那行复制去google或百度搜索一下,一般都会有答案。
编译安装
前面configure
检查没报错之后,make
就是编译,make install
就是安装,一般都是两个命令合并在一起
make && make install
最终安装完之后,最后几句如下所示
Wrote PEAR system config file at: /usr/local/php/etc/pear.conf
You may want to add: /usr/local/php/lib/php to your php.ini include_path
/root/php-compile/php-7.4.32/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin/phar.phar
ln -s -f phar.phar /usr/local/php/bin/phar
Installing PDO headers: /usr/local/php/include/php/ext/pdo/
做一些初始化工作
把php的可执行文件都加入到系统环境变量中
ln -s /usr/local/php/sbin/* /usr/local/sbin/
ln -s /usr/local/php/bin/* /usr/local/bin/
添加php.ini:
源码安装默认是没有安装php.ini的,但其实我们最开始解压的那个php源码文件夹里就已经有两个php.ini文件,一个是开发环境使用,一个是生产环境使用
> php-7.4.32 # ls -l | grep php.ini
-rw-rw-r-- 1 root root 72554 Sep 28 09:09 php.ini-development
-rw-rw-r-- 1 root root 72584 Sep 28 09:09 php.ini-production
我们把生产环境就php.ini复制到……复制到哪儿呢?我们可以从phpinfo中查看(用-r
可以直接在命令行中执行php语句)
/usr/local/php/bin/php -r 'phpinfo();' | grep 'php.ini'
输出如下
Configuration File (php.ini) Path => /usr/local/php/etc
所以我们要把php.ini-development复制到/usr/local/php/etc/
下并重命名为php.ini
cd php-7.4.32
cp php.ini-development /usr/local/php/etc/php.ini
添加php-fpm.conf:
我们查看一下etc文件夹的文件
cd /usr/local/php/etc
ls -l
输出如下
-rw-r--r-- 1 root root 1233 Oct 11 16:38 pear.conf
-rw-r--r-- 1 root root 5377 Oct 11 16:37 php-fpm.conf.default
drwxr-xr-x 2 root root 4096 Oct 11 16:37 php-fpm.d
-rw-r--r-- 1 root root 72554 Oct 11 17:22 php.ini
可以看到php-fpm的配置文件默认是有个default为结尾的,我们要把它的default去掉吗?是要的,但是不要直接去掉,而是copy一份,带default结尾的相当于是一个默认文件,万一你copy的那份不小心搞乱了,可以再从删掉,default那重新copy一份,这样就相当于“恢复默认”了
cp php-fpm.conf.default php-fpm.conf
这样就完了吗?其实php-fpm.conf的最后一行是这样的,也就是说它还包含了子项
include=/usr/local/php/etc/php-fpm.d/*.conf
通过查看“php-fpm.d”中的文件发现,其实子项也一样,默认是有个default的,我们也要copy一份
cd php-fpm.d
cp www.conf.default www.conf
创建一个非登录用户“www”(它会自动创建www组),因为我们前面configure里是设置了使用www用户和www组来运行的(当然你也可以在php-fpm.conf中改)
useradd -s /sbin/nologin -M www
如果你是在docker容器中,需要用以下命令
# 容器外创建www用户,它会自动创建同名的组
useradd -s /sbin/nologin -M www
# 容器内创建www组,gid要跟容器外的组id相同
groupadd -g 1001 www
# 容器内创建www用户,并且它的uid和gid要跟容器外的www的uid和gid相同
useradd -s /sbin/nologin -M -g 1001 -u 1001 www
运行php-fpm,如果不报错,说明就成功了
/usr/local/php/sbin/php-fpm &
可以这样查看进程
ps aux | grep php-fpm
如下所示
root 175927 0.0 0.4 165884 9008 ? Ss 11:20 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
www 175928 0.0 0.4 165884 8544 ? S 11:20 0:00 php-fpm: pool www
www 175929 0.0 0.4 165884 8544 ? S 11:20 0:00 php-fpm: pool www
root 175931 0.0 0.0 9108 860 pts/4 S+ 11:21 0:00 grep --color=auto php-fpm
我们实际使用的话,如果直接在系统中,应该使用systemctl来运行,但是我不确定service文件会在哪儿,我觉得应该是在php安装文件夹/usr/local/php/
中,把它复制到/etc/systemd/system/
中就行,然后执行以下命令启动
systemctl start php-fpm
但是如果在docker中,需要设置个Dockerfile来运行,我这里暂时就不写了,后面我实际做了再补吧。
编译php扩展
查询xdebug版本
怎样知道php要使用哪个版本的xdebug?xdebug官方有个wizard工具,只要把你的phpinfo粘贴进去,它让分析,它就能判断你的php应该安装哪个版本的xdebug。
wizard工具在哪儿呢?在xdebug官网的compile部分,有一句话是这样的:
There is a wizard available that provides you with the correct file to download, and which paths to use.
其中wizard是一个链接,点击它就能进入wizard了,如下图所示
把php -i
输出的内容粘贴到上图的框里,然后点击下边的“Analyse my phpinfo() output”按钮提交,提交后它会告诉你要安装哪个版本的xdebug(或者如果你已经安装过了它也会显示出已安装的信息)。
由于php -i
输出的内容比较多,一屏显示不下可能导致不方便或无法复制全部内容,你也可以用以下方法,把它先保存到一个文件中,再打开文件,复制文件的内容
# 把php -i输出的内容保存到php-i.txt文件中
php -i > /path/to/php-i.txt
但有时候会显示以下结果,但是它也没有直接说不支持,如果有不支持的,是会直接说的
Could not find any useful information.
源码编译php扩展的方法
其实编译扩展和编译php或者编译其它软件是一样的,因为都是C语言写的代码,编译方法无非就是用configure或cmake生成Makefile,然后make && make install
安装。
php的扩展,我见过的都是用./configure
来生成Makefile的,所以应该是没有用cmake的,但是你随便找个php扩展(比如redis)它的源码都是没有configure文件的,可是没有configure文件怎么运行./configure
来生成Makefile?
没有configure文件,我们就要自己生成,怎么生成呢?还记得本文开头说的GNU通用编译方法吗?如果不记得可以回去看看,其实configure文件是用autoconf工具生成的,所以如果你系统中没有autoconf,你得安装一个
# debian安装autoconf
apt install -y autoconf
# centos7安装autoconf
yum install -y autoconf
安装完autoconf后怎么生成configure文件呢?这时候phpize就派上用场了,我们在终端进入php扩展源码所在路径,然后在该路径下执行phpize
即可生成configure文件,因为phpize是会调用autoconf来生成的,如果你系统中没有autoconf,则phpize会报错,说找不到autoconf。
生成configure文件之后,我们就可以执行./configure
命令了
./configure --with-php-config=/usr/local/php/bin/php-config
只需要传一个选项--with-php-config
,即php-config,它是一个shell脚本,在php的bin目录下,它用于获取你所安装的PHP配置的信息,比如用以下命令就可以获取你编译php时用了什么选项
php-config --configure-options
运行完configure后,就可以make和make install了
make && make install
安装语句一般会有如下信息,即告诉你安装到哪儿了
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/
当然其实我们直接看phpinfo也是有的,其实它会安装到哪个地方,就是通过php-config
读取了php的配置,知道应该把扩展安装到什么地方
php -r "phpinfo();" | grep extension_dir
安装完之后,最后还要在php.ini中引用它,在php.ini中的[php]
模块下的任意位置添加extension=扩展文件名
即可,比如扩展文件名是redis.so
,那你就添加extension=redis.so
,路径是不用写的。但有例外,比如xdebug,则必须写成zend_entension=xdebug.so
,如果你不确定要不要“zend_”,那就随便用其中一个试试,如果不行肯定会报错,然后你再用另一个就行。
但是其实我们最好不要随便在任意位置添加,因为这样可能会有点乱,我们一般在头部或尾部加,当然你也可以在php.ini中搜索“Dynamic Extensions”,它会有以下模块的注释,代表这里是添加动态扩展的,你在这个位置添加也行
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
最后就是重启php-fpm让它生效了,编译都会了,重启我就不说了,要不就是用systemctl重启,要不就是杀掉它的进程再重新启动
# 杀php-fpm进程,不过它一定会报:kill: sending signal to 186918 failed: No such process
# 但这个不算错误,因为可能是杀掉几个之后其它的自动就关闭了,导致找不到pid
ps aux | grep php-fpm | awk '{print $2}' | xargs kill -9
重启后用以下命令查看是否正确安装,如果有被引用到,则会输出很多xdebug的配置信息,否则输出为空
php -r 'phpinfo();' | grep xdebug
参考:
源码编译安装
Install PHP 7.4 on CWP Control Panel – Manual Installation Guide