前言
因项目需要使用php的parallel扩展,在安装过程中,系统提示”parallel requests ZTS,please use PHP with ZTS enabled“
意思是要使用启用了ZTS的php才能安装parallel,查询相关资料后发现,ZTS是需要在编译php时配置上去的,无法在编译后配置启用。之前一直用宝塔或者docker直接安装编译的php,一般都是没带parallel的,那怎么办了,见招拆招。就开始了一段php源码编译之旅。
什么是ZTS?ZTS就是Zend Thread Safely的简写,意思是说这个版本的PHP是基于线程安全的,相对的有一个版本叫做NTS,就是None Thread Safely,意思是非线程安全的
php为什么默认禁用ZTS?PHP 最初是作为 CGI 二进制文件开始的,然后作为 Apache 的一个模块。这两种方式都不需要 PHP 成为线程运行时,因为它们都将按顺序处理请求
一、下载php源码
我这里下载的是php8.1,系统用的是DeBian
cd /usr/local/src
wget https://www.php.net/distributions/php-8.1.21.tar.gz
二、解压源码
tar -zxvf ./php-8.1.1.tar.gz
cd php-8.1.1
三、执行编译
./configure --prefix=/usr/local/php81 --enable-debug --enable-zts --with-config-file-path=/usr/local/php81/etc --with-config-file-scan-dir=/usr/local/php81/conf.d --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv=/usr/local --with-freetype=/usr/local/freetype --with-jpeg --with-zlib --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --with-curl --enable-mbregex --enable-mbstring --enable-intl --enable-pcntl --enable-ftp --enable-gd --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-zip --enable-soap --with-gettext --enable-opcache --with-xsl --with-pear
这里要特别注意--enable-debug --enable-zts,只有加入enable-zts,编译起来的php才是ZTS版本。
本来以为很顺利,没变想到安装过程报了很多错误,老俊见招拆招,花了不少时间,总算顺利安装成功。错误一般都是发生在编译阶段。下面我一一记录。后面如果有同学遇到同样问题,可以参考我的解决方法。
No package 'sqlite3' found
如果遇到:“No package 'sqlite3' found”的报错,则运行 apt-get remove sqlite3删除sqlite3
然后运行:
apt install sqlite3 libsqlite3-dev
No package 'zlib' found
如果报zlib找不到,则运行
apt-get install zlib1g-dev
No package 'libcurl' found
如果报libcurl找不到,则运行
apt-get install libcurl4-openssl-dev
No package 'libpng' found
如果libpng找不到,则运行
apt install libpng-dev
configure: error: iconv does not support errno
如果发现iconv没安装好,一般是已安装的版本不兼容导致,需重新编译iconv
运行如下脚本:
# cd /usr/local/src/
# wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
# tar zxvf ./libiconv-1.16.tar.gz
# cd libiconv-1.16
# ./configure --prefix=/usr
# make & make install
No package 'freetype2' found
如果遇到freetype2错误,则运行
apt install libfreetype-dev libfreetype6-dev
No package 'libxslt' found
则运行
apt install libxslt-dev
No package 'libzip' found
则运行
apt install libzip-dev
注意:如果您使用的是Centos,centos一般是用yum来安装软件包,yum源的包名和Debian是有点不一样的。一般需要把dev改为devel即可,如在Debian中用apt install libzip-dev,而在centos中可能是用yum install libzip-level
构建
编译阶段后,就可以运行构建了
make && make install
构建需要经历一段时间,构建好了之后我们创建个php的软连接。
ln -s /usr/local/php81/bin/php /usr/local/bin/php
此时就可以愉快的使用带ZTS的php啦!