在CentOS 7 / Debian 11中源码编译php 7.4.32

在CentOS 7 / Debian 11中源码编译php 7.4.32

GNU通用编译方法

关于编译

C/C++语言编写的程序,源码编译都是用make命令编译,然后用make install命令安装,但关键是在编译之前需要生成一个“Makefile”文件,然后make命令才能根据这个Makefile来编译,目前生成Makefile的方法有两种:

  • 1、AutoTools方式:如果源码中有configure文件,那就代表用的是AutoTools(包含autoconf,automake,libtool)方式,configure文件就是编写程序的人用autoconfautomake这两个工具生成的,我们执行./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的yumdebian/ubuntuaptapt-get,但有时候包管理工具中发布的未必能跟上最新,如果包管理工具中的不够新而你又要用到新的,那就只能源码编译了。而且Rehat系的包名经常跟Debian系不同,比如zlib(用于支持gzip压缩),在redhat系的系统中是zlib zlib-devel,而在debian系的系统中却是zlib1g zlib1g-dev

对于Redhat系的-devel包以及Debian系的-dev包,无论是“devel”还是“dev”,都是“develop”的意思,develop指的是“开发包”,这种版本中,包含了“运行库和头文件”,当一个程序需要依赖另一个程序时(比如php需要调用zlib的功能),在编译的时候,就必须要包含这些“运行库和头文件”才能调用它的接口,这也是为什么我们在使用yumapt等包管理工具安装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这个可执行文件)
-w426


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.dphp.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,安装后它会同时有pearpecl两个命令,所以,虽然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:latestyum 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

打赏
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

在CentOS 7 / Debian 11中源码编译php 7.4.32