在 centOS9 上编译安装 PHP8
安装准备
安装oniguruma
,下载网址:https://github.com/kkos/oniguruma/releases
cd /usr/local/srcwget -c https://github.com/kkos/oniguruma/releases/download/v6.9.8/onig-6.9.8.tar.gz --no-check-certificate
若上面命令下载从提示超时,那么就自己手工下载。然后复制到/usr/local/src目录下。
cd /usr/local/srctar -zxf onig-6.9.8.tar.gzcd /usr/local/src/onig-6.9.8 autoreconf -vfi ./configure --prefix=/usr --libdir=/usr/lib64 # 注意:此处安装路经不省略,若省略,php make时提示找不到该包 make make install
- --prefix=/usr不省略,若省略,php make时提示找不到该包。
- --libdir=/usr/lib64如果不使用这个参数,编译 PHP 仍将报错,编辑 ldconfig 配置无法解决问题。
装PHP过程中出现如下错误信息:
No package 'oniguruma' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables ONIG_CFLAGS
and ONIG_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.这个错误信息是由于mbstring的正则功能需要oniguruma的支持,编译PHP的时候使用了“--enable-mbstring”参数,系统中却没有oniguruma库。不使用mbstring的正则功能,即在“--enable-mbstring”后再添加“--disable-mbregex”参数。这样的配置将不再需要oniguruma库。
装PHP过程中出现如下错误信息:
Package 'oniguruma', required by 'virtual:world', not found
configure: error: Package requirements(oniguruma)were not met:需要使用这个命令安装:dnf --enablerepo=powertools install oniguruma-devel
或(如果报错)
dnf --enablerepo=PowerTools install oniguruma-devel
下载解压 PHP8
下载地址:https://www.php.net/downloads
cd /usr/local/srcwget -c https://www.php.net/distributions/php-8.2.8.tar.gz --no-check-certificatetar -zxf php-8.2.8.tar.gzcd /usr/local/src/php-8.2.8
编译php
./configure --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --with-fpm-user=www \ --with-fpm-group=www \ --enable-fpm \ --enable-mysqlnd \ --enable-pdo \ --enable-gd \ --enable-exif \ --enable-intl \ --enable-calendar \ --enable-filter \ --enable-session \ --enable-bcmath \ --enable-shmop \ --enable-sysvsem \ --enable-simplexml \ --enable-xml \ --enable-mbregex \ --enable-mbstring \ --enable-opcache \ --enable-pcntl \ --enable-soap \ --enable-sockets \ --enable-sysvsem \ --enable-static \ --enable-tokenizer \ --enable-fileinfo \ --enable-cli \ --with-mysqli \ --with-pdo-mysql \ --with-pdo-sqlite \ --with-curl \ --with-bz2 \ --with-jpeg \ --with-gettext \ --with-freetype \ --with-kerberos \ --with-libdir=lib64 \ --with-openssl \ --with-zlib \ --with-mhash \ --with-pear \ --with-iconv \ --with-pcre-jit
便于复制,可以复制下面的编译命令
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-fpm-user=www --with-fpm-group=www --enable-fpm --enable-mysqlnd --enable-pdo --enable-gd --enable-exif --enable-intl --enable-calendar --enable-filter --enable-session --enable-bcmath --enable-shmop --enable-sysvsem --enable-simplexml --enable-xml --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-soap --enable-sockets --enable-sysvsem --enable-static --enable-tokenizer --enable-fileinfo --enable-cli --with-mysqli --with-pdo-mysql --with-pdo-sqlite --with-curl --with-bz2 --with-jpeg --with-gettext --with-freetype --with-kerberos --with-libdir=lib64 --with-openssl --with-zlib --with-mhash --with-pear --with-iconv --with-pcre-jit
继续安装
make make install
设置php
cp /usr/local/src/php-8.2.8/php.ini-production /usr/local/php/etc/php.iniln -s /usr/local/php/etc/php.ini /etc/php.inicp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.confcp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
做软链,以便直接用 php 命令运行
ln -s /usr/local/php/bin/php /usr/local/sbin/phpln -s /usr/local/php/bin/phpize /usr/local/sbin/phpizeln -s /usr/local/php/bin/pecl /usr/local/sbin/pecl
建立软链接后,查看php版本
php -v
查看已经加载的模块
php -m | less
查看 php 配置文件
php -i | grep ini
配置 php.ini
php.ini 是 php 运行核心配置文件
vim /usr/local/php/etc/php.ini
再测试环境下,需要修改内容如下:
date.timezone="Asia/Shanghai" memory_limit = 256M file_uploads = On upload_tmp_dir = "/tmp" upload_max_filesize = 20M post_max_size = 28M [mbstring] mbstring.language=Chinese mbstring.internal_encoding = UTF-8 [opcache] opcache.enable=1 opcache.enable_cli=1 [Pcre] pcre.backtrack_limit=99999999 pcre.recursion_limit=99999999 [Pdo_mysql] pdo_mysql.default_socket=/usr/local/mysql/run/mysqld.sock [MySQLi] mysqli.default_socket =/usr/local/mysql/run/mysqld.sock [Session] session.save_path = "/tmp"
php.ini中,设置图片文件上传大小的方法:
file_uploads :是否允许通过 HTTP 上传文件的开关,默认 On,即是开,允许上传。upload_tmp_dir :上传文件放置的临时目录。在 Windows 默认C:/windows/temp,在 Linux 默认/tmp。若自己修改了此位置,需要保证 PHP 执行者,拥有写入权限。max_file_uploads :允许同时上传的最大文件数。单次提交的表单中,所上传文件的最大数量。默认值 20。upload_max_filesize :允许上传文件大小的最大值。单次提交的表单中,所有上传文件的数据总量。默认 2M。post_max_size :在采用 POST、PUT 等方法,一次表单提交中 PHP 所能够接收的最大数据量。需要将此值改为比upload_max_filesize
要大些,因为此值含有,有表单字段内容数据+上传文件数据。。默认值 8M。如果 POST 数据超出限制,那么$_POST和$_FILES将会为空。另外,该值应当于memory_limit
值。memory_limit :限制 PHP 进程对于内存的使用。是指定单个PHP 脚本程序,可以使用的最大内存容量。为了避免正在运行的脚本大量使用系统可用内存,主要是为了防止程序 bug,或者死循环占用大量的内存,导致系统宕机。默认值 128 M。此值应当适当大于post_max_size
的值。max_input_time :脚本解析输入数据(POST、GET、PUT 等数据)允许的最大时间。它从接收所有数据到开始执行脚本进行测量的。默认值 60,单位是秒。max_input_time
计时完毕后,才进入max_execution_time
计时。max_execution_time :每个 PHP 脚本的最大可执行时间。这设置了脚本被解析器中止之前允许的最大执行时间。默认值 30,单位是秒。从命令行(CLI 模式)运行 PHP 时,默认值 0。这有助于防止写得不好的脚本占尽服务器资源。当脚本进入了一个无限循环状态时,此变量非常有用。然而,当存在一个需要很长时间完成的合法活动时(例如上传大型文件),这项功能也会导致操作失败。在这样的情况下必须考虑将此变量值增加。
配置 php-fpm.conf
php-fpm.conf
是php-fpm进程服务的配置文件
cd /var/log/touch php-fpm.logchown www:www /var/log/php-fpm.logcd /usr/local/phpmkdir -p /usr/local/php/runchown -R www:www /usr/local/php/run
配置 php-fpm.conf
vim /usr/local/php/etc/php-fpm.conf
pid = /usr/local/php/run/php-fpm.pid error_log = /var/log/php-fpm.log daemonize = yes
配置 www.conf
www.conf 这是 php-fpm 进程服务的扩展配置文件:
vim /usr/local/php/etc/php-fpm.d/www.conf
www.conf 默认配置,不需要修改。其内容:
user = www group = www listen = 127.0.0.1:9000 pm = dynamic
nginx 和 php-fpm 的进程间通信有两种方式
一种是TCP,一种是UNIX Domain Socket。其中TCP是IP加端口,可以跨服务器。而UNIX Domain Socket不经过网络,只能用于 Nginx 跟 PHP-FPM 都在同一服务器的场景。
tcp方式开启:
user = www
group = www
listen = 127.0.0.1:9000
tcp方式注释掉:
;listen.owner = www
;listen.group = www
;listen.mode = 0666
socket方式开启:
listen =/usr/local/php/run/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0666
socket方式注释掉:
;user = www
;group = www
php-fpm 指定 php.ini 路径
/usr/local/php/sbin/php-fpm -y /usr/local/php/etc/php-fpm.conf -c /etc/php.ini
event 扩展
PHP 有大量的扩展可以使用,比如用于连接数据库的扩展 mysqli,图形库 gd2 等。扩展有两种安装方法:
- pecl安装。PECL(PHP Extension Community Library),是一个开放的并通过 PEAR(PHP Extension and Application Repository,扩展和应用仓库),打包格式来打包安装的 PHP 扩展库仓库。通过 PEAR 的 Package Manager 的安装管理方式,可以对 PECL 模块进行下载和安装。通过
pear install xxx
安装 - 用phpize源码编译安装。
使用 phpize 添加 event 扩展
event 扩展https://pecl.php.net/package/event
cd /usr/local/srcwget -c https://pecl.php.net/get/event-3.0.8.tgz --no-check-certificatetar -zxf event-3.0.8.tgz
cd /usr/local/src/event-3.0.8 phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
编译安装完成之后,在/usr/local/php/lib/php/extensions/no-debug-non-zts-20220829目录下,生成的event.so文件,目录已经默认被php.ini加载,但event.so文件需要手工添加。
vim /usr/local/php/etc/php.ini
在 extension 设置的最后一行加入如下配置:
extension=event.so
查看 event 库插件是否安装成功
php -m | grep event
安装 PHP 调式工具 Xdebug
PHP Xdebug是一个开放源代码的 PHP 程序调试器,即一个 Debug 工具,可以用来跟踪,调试和分析 PHP 程序的运行状况。
cd /usr/local/src/ wget -c https://xdebug.org/files/xdebug-3.2.2.tgz --no-check-certificate tar -zxf xdebug-3.2.2.tgz
使用 phpize 添加 xdebug 扩展
# 进入解压目录cd /usr/local/src/xdebug-3.2.2 # 启动 phpize phpize # 编译 ./configure --enable-xdebug --with-php-config=/usr/local/php/bin/php-config # 安装测试make test # 安装 make && make install
译安装完成之后,在/usr/local/php/lib/php/extensions/no-debug-non-zts-20220829目录下,生成的xdebug.so文件。添加扩展:
vim /usr/local/php/etc/php.ini
extension=event.so zend_extension=xdebug.so
[Xdebug] ;显示默认的错误信息 xdebug.default_enable=on ;自动打开“监测函数调用过程”的功模。该功能可以在你指定的目录中将函数调用的监测信息以文件的形式输出。此配置项的默认值为 off。 xdebug.auto_trace=on ;打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。此配置项的默认值为 off。 xdebug.collect_params=on ;打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。此配置项的默认值为 off。 xdebug.collect_return=on xdebug.max_nesting_level=100 ;打开效能监测器。 xdebug.profiler_enable=on ;是否远程调试 xdebug.remote_enable=on ;远程调试地址 xdebug.remote_host=localhost ;远程调试端口 xdebug.remote_port=9000 ;远程连接协议 xdebug.remote_handler=dbgp;设定函数调用监测信息的输出文件的路径。 xdebug.trace_output_dir="/tmp" ;设定效能监测信息输出文件的路径 xdebug.profiler_output_dir="/tmp"
必须重启重启 php-fpm,phpinfo()
才能显示出来 xdebug 已经被加载运行。
systemctl restart php-fpm
# 查看是否安装成功php -m | grep xdebug
启动 php-fpm
开机自启动
设置开机自启动 php-fpm。新建php-fpm服务文件
vim /usr/lib/systemd/system/php-fpm.service
内容如下:
[Unit] Description=The PHP FastCGI Process Manager After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/usr/local/php/run/php-fpm.pid ExecStart=/usr/local/php/sbin/php-fpm ExecReload=/bin/kill -USR2 $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
systemctl enable php-fpm
使用 systemctl 管理 php-fpm
#启动 php-fpmsystemctl start php-fpm #停止 php-fpmsystemctl stop php-fpm #重载配置文件systemctl reload php-fpm #重启 php-fpmsystemctl restart php-fpm #查看自启动情况systemctl list-unit-files | grep php-fpm #查看 php-fpm启动状态systemctl status php-fpm
php-fpm 检测配置文件
创建软链接ln -s /usr/local/php/sbin/php-fpm /usr/local/sbin/php-fpm 检测配置文件php-fpm -t 或者/usr/local/php/sbin/php-fpm -t