Linux安装PHP

标签: 无 分类: 未分类 创建时间:2021-11-21 00:51:30 更新时间:2025-09-26 04:44:39

1.前言

~我这里在 CentOS8.0 上编译安装 PHP 8.0.13,安装路径为 /usr/local/php~ ,刚开始我确实是在CentOS8中安装等PHP8,但是后来发现,原先他们写的程序运行不了,只能降级了,降级到了PHP7.3.33,降级到7.3.33 也还是不行,只能降级到7.2.9,历史版本

我在RocyLinux9上安装,开始安装了php8,结果因为sqlserver驱动的问题,降到了 7.2.9,结果还是不行,后来我把 openssl 从 3.0降到了 1.1.1k,结果 php 无论如何都编译不通过了,只能另寻他法了,我尝试再次降级php,直接降级到了 5.6.40。

  • PHP 7.2.9
  • OpenSSL 1.1.1k
  • pdo_sqlsrv 5.8.1

2.安装依赖

1
2
3
4
5
6
7
yum install -y libxml2-devel openssl-devel libcurl-devel gd gd-devel libmcrypt libmcrypt-devel libtool sqlite-devel libicu-devel gcc-c++ glibc-headers libxslt-devel libjpeg-devel libzip-devel bzip2-devel

# Rocky Linux 9 这样安装
dnf config-manager --enable crb
dnf --enablerepo=crb install oniguruma-devel
# 早期版本
dnf --enablerepo=powertools install oniguruma-devel

缺什么依赖,就安装什么依赖

参考文章:
【1】.php 7.4 error installed
【2】.How to get epel-release / epel-release-next / powertools in CentOS Stream 9
【3】.How do I install PowerTools on Rocky Linux 9 Powertools is known as crb under RL9. dnf config-manager –enable crb

3.下载

下载文件

4.配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
## PHP 8.0配置
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc \
--with-curl --with-freetype --enable-gd --with-jpeg --with-gettext --with-kerberos --with-libdir=lib64 --with-libxml \
--with-mysqli --with-openssl --with-pdo-mysql --with-pdo-sqlite --with-pear --enable-sockets --with-mhash --with-ldap-sasl \
--with-xsl --with-zlib --with-zip -with-bz2 --with-iconv --enable-fpm --enable-pdo --enable-bcmath --enable-mbregex \
--enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem \
--enable-xml --enable-sysvsem --enable-cli --enable-opcache --enable-intl --enable-calendar --enable-static --enable-mysqlnd

## 自定义openssl
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc \
--with-curl --with-freetype --enable-gd --with-jpeg --with-gettext --with-kerberos --with-libdir=lib64 --with-libxml \
--with-mysqli --with-openssl --with-openssl-dir=/usr/local/ssl --with-pdo-mysql --with-pdo-sqlite --with-pear --enable-sockets --with-mhash --with-ldap-sasl \
--with-xsl --with-zlib --with-zip -with-bz2 --with-iconv --enable-fpm --enable-pdo --enable-bcmath --enable-mbregex \
--enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem \
--enable-xml --enable-sysvsem --enable-cli --enable-opcache --enable-intl --enable-calendar --enable-static --enable-mysqlnd

## PHP 7.2配置
./configure --prefix=/usr/local/php --exec-prefix=/usr/local/php --bindir=/usr/local/php/bin --sbindir=/usr/local/php/sbin --includedir=/usr/local/php/include --libdir=/usr/local/php/lib/php --mandir=/usr/local/php/php/man --with-config-file-path=/usr/local/php/etc -with-libxml-dir=/usr --with-iconv-dir --with-mhash --with-openssl --with-mysqli --with-pdo-mysql --with-gd --with-iconv --with-zlib --enable-zip --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-mbregex --enable-mbstring --enable-ftp --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-jpeg-dir --with-freetype-dir --enable-opcache --enable-fpm --without-gdbm --disable-fileinfo --with-xsl


./configure --prefix=/usr/local/php --exec-prefix=/usr/local/php --bindir=/usr/local/php/bin --sbindir=/usr/local/php/sbin --includedir=/usr/local/php/include --libdir=/usr/local/php/lib/php --mandir=/usr/local/php/php/man --with-config-file-path=/usr/local/php/etc -with-libxml-dir=/usr --with-iconv-dir --with-mhash --with-openssl --with-openssl-dir=/usr/local/openssl --with-gd --with-iconv --with-zlib --enable-zip --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-mbregex --enable-mbstring --enable-ftp --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-jpeg-dir --with-freetype-dir --enable-opcache --enable-fpm --without-gdbm --disable-fileinfo --with-xsl

参考文章:
1.安装篇六:安装PHP(7.2.29版本)
2.php7.2编译参数,php 7.2 编译安装

5.安装

1
make && make install

6.生成配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 生成php配置文件
cp php.ini-production /usr/local/php/etc/php.ini
## 生成www配置文件
cd /usr/local/php/etc/php-fpm.d/
cp www.conf.default www.conf
## 生成php-fpm配置文件
cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf
## 生成php-fpm服务启动文件,从源码路径拷贝
mkdir /usr/local/php/daemon
## 根据安装的版本
cp /home/soft/php-8.0.13/sapi/fpm/init.d.php-fpm /usr/local/php/daemon/php-fpm

chmod 740 /usr/local/php/daemon/php-fpm

7.启动

1
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
/usr/local/php/daemon/php-fpm start

## 查看启动
ps auxfww | grep php | grep -v grep

## 查看端口
ss -lntp | grep php

## 停止
/usr/local/php/daemon/php-fpm stop

## 配置开机自启,我暂时没有试
vi /lib/systemd/system/php.service

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/daemon/php-fpm start
ExecReload=/usr/local/php/daemon/php-fpm restart
ExecStop=/usr/local/php/daemon/php-fpm stop

[Install]
WantedBy=multi-user.target

# 开机启动
systemctl start php
systemctl stop php
systemctl enable php

参考文章:
【1】.php-fpm开机自启动详细教程

8.nginx配置

1
2
3
4
5
6
7
8
9
10
11
server {
listen 8003;
root /data/web/phpweb/html;

location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

参考文章:
1.CentOS-7 编译安装php-7.4
2.CentOS 源码编译安装 PHP
3.linux(centos8):编译安装php8.0正式版并启用jit及php8安装时的报错处理(centos8.2 / php8.0.0 ) 里面还有遇到问题的解决方法,比如:’icu-uc’、’icu-io’
4.configure: error: C++ preprocessor “/lib/cpp” fails sanity check
5.Package ‘oniguruma’, required by ‘virtual:world’, not found
6.centos8安装php7.4

9.SQLServer驱动

因为我才用的是编译安装PHP的方法,所以pecl可能使不上力,只能靠蛮力了。

1
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
## 加入微软源
curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssqlrelease.repo
## 卸载原有版本
yum remove unixODBC
## 安装驱动
yum install msodbcsql mssql-tools unixODBC-devel

## 下载pdo_sqlser扩展包,安装
#下载扩展包
wget http://pecl.php.net/get/pdo_sqlsrv-5.12.0.tgz
#解压扩展包
tar -zxvf pdo_sqlsrv-5.12.0.tgz
#进入解压目录
cd pdo_sqlsrv-5.12.0
#执行PHP的一个扩展命令
/usr/local/php/bin/phpize
#编译
./configure --with-php-config=/usr/local/php/bin/php-config
#安装
make && make install


## 添加pdo_sqlsrv扩展
# 修改 php.ini 文件
vi /usr/local/php/etc/php.ini
# 添加
extension=pdo_sqlsrv.so

## 下载sqlser扩展包,安装
#下载扩展包
wget http://pecl.php.net/get/sqlsrv-5.12.0.tgz
#解压扩展包
tar -zxvf sqlsrv-5.12.0.tgz
#进入解压目录
cd sqlsrv-5.12.0
#执行PHP的一个扩展命令
/usr/local/php/bin/phpize
#编译
./configure --with-php-config=/usr/local/php/bin/php-config
#安装
make && make install

## 添加sqlsrv扩展
# 修改php.ini
vim /usr/local/php/etc/php.ini
# 添加
extension=sqlsrv.so

## 重启php

一系列鬼操作,sqlserver的驱动终于是安装上了。

参考文章:
1.PHP7 安装sqlsrv、pdo_sqlsrv扩展 centos 这篇文章绝了

10.MySQL驱动

直接看下面的解决方案吧,因为mysql路径的问题,我没有重新编译成功mysql的驱动

可能我在编译的时候,没有把mysql的编译选项弄好,所以最后导致了没有mysql驱动,这是使用和安装sql server的方式类似的方法进行的,在安装编译完成了php之后,重新进行了mysql驱动配置。但是我在重新配置的时候,还是遇到了问题,就是这个 –with-pdo-mysql 参数的问题,我其实没有安装mysql的,这个时候该怎么指定mysql的路径呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 安装mysql驱动
yum install mysql-devel
yum install php-mysqlnd

## 下载
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
## 解压
tar zxvf PDO_MYSQL-1.0.2.tgz
## 进入目录
cd PDO_MYSQL-1.0.2
## 初始化配置
/usr/local/php/bin/phpize
## 重新编译
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=mysqlnd

./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr

make
make install
## 编辑配置文件
vi /usr/local/php/etc/php.ini

# 找到 extentions 这一个配置段, 接着增加 pdo_mysql.so 就行了
extension = pdo_mysql.so

参考文章:
【1】.为PHP增加PDO-Mysql驱动 要mysql路径的
【2】.编译安装php时提示Cannot find MySQL header files的解决方法
【3】.php链接mysql的驱动包_php中的连接mysql驱动类
【4】.php 安装 pdo_mysql 安装pdo_mysql, –with-pdo-mysql=/usr/local/mysql, –with-mysql=/usr 这个参数
使用find命令寻找mysql客户端安装目录,这里只需要写–with-mysql=/usr

1
2
# find / -name mysql.h
/usr/include/mysql/mysql.h

【5】.CentOS安装pdo_mysql 这是找不到mysql的头文件了,需要建一个软连接,ln -s /usr/include/mysql/* /usr/local/include/
【6】.php的 mysqlnd驱动 php5.3之后支持一个叫mysqlnd的东西,是php 自带的连接mysql 的方式,更快的执行速度,更少的内存消耗。
【7】.搭建Rocky Linux8+Nginx+Php+Mysql+Redis 服务器 这里通过 dnf 的方式安装了 php。
【8】.php 之 源码包编译安装
【9】.MySQL Functions (PDO_MYSQL) ¶

【解决方案】
我虽然没有重新安装成功mysql的驱动,但是我重新编辑了php.ini文件,把其中的 mysql 相关的扩展打开了,重新启动了php,最后可以了。

1
2
extension=mysqli
extension=pdo_mysql

(1) error: can not find mysql under the “/usr/bin/mysql” that you specified
我是先安装的php,可能在编译的时候,没有找到配置文件,不知道为什么不行

参考文章:
1.LINUX下安装PHP,而不安装mysql
2.关于编译PHP的一点思考
3.如何查看yum 安装的软件路径(不要再忘了)
4.mysql安装出现configure_安装MySQL报错:configure: error: Unable to find your mysql installation…

11.问题

1.二级目录引发的404问题

在一个目录下放置了html文件之后,可以进行访问,但是同目录下的php无法访问。

【尝试方法】
以为是因为php使用的不是root用户,但是nginx启动的时候使用的是root用户,所以无法访问,但是我修改了php的www.conf配置,发现无法使用root启动php。

【解决方法】
这个问题,主要就是因为在Nginx中配置了二级目录,不要二级目录可以暂时解决问题,但是我因为应用程序很多的地方都使用了这个二级目录,所以暂时改不了。

参考文章:
1.nginx访问php文件404
2.Nginx+PHP php文件404错误的一个可能原因 修改50x错误页面的正确root地址,修改nginx的运行用户为www,重启nginx
3.centos 7: 使用systemctl,Root 身份运行php-fpm
4.centos nginx+php 目录下的项目访问显示404 这里使用了nginx也是不行的

2.thinkphp引发的404

我解决了二级目录引发的404问题之后,出现了简单的php没有问题,但是thinkphp文件返回404的问题。

1
<?php echo 'hello world'?>

【尝试方法】
(1) nginx设置伪静态

1
2
3
4
5
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
}

(2) runtime目录设置读写权限

1
chmod 777 -R runtime

不起作用

(3) 开启调试模式
在 application/config.php中的app_debug配置参数,改为ture,就能在页面中看到剧透的错误了,而不是直接404错误。

1
2
// 关闭调试模式
'app_debug' => false,

参考文章:
1.Thinkphp nginx 下 404 问题排查及解决 这里是说没有权限
2.thinkphp部署服务器后出现404错误 这提到了一个伪静态的问题,还有一个就是写权限的问题
3.7)调试模式

3.模块不存在

但我开启了 debug 模式之后,看到的错误消息,就是模版不存在

【尝试方法】
(1) 修改 application/config.php 文件

1
2
## 指向自己的模块名
'default_module' => 'Services'

(2) 修改了模块名的大小写
本来我 application 文件夹下有一个Services文件(这在windows上是可行的),我把它改了小写。

虽然模块不存在的问题,没有了,但是又出现了新的问题,也就是说这个问题还是没有解决

参考文章:
1.TP5自动生成目录报错-模块不存在:index 一直照着这个做,但是还是不行,说是没有自动生成的模版
2.服务器tp框架报错index.php 模块不存在问题
3.thinkphp5.1提示模块不存在:index 这里说是把目录名改成小写,
4.TP5 控制器命名大小写问题

4.ReflectionParameter::getClass() is deprecated

这个问题是PHP 8.0导致的,我才想起来,原先人家写的php是在7.x下运行的,没办法,我只能回去了。

参考文章:
1.PHP 8.0: ReflectionParameter::getClass()), ::isArray(), and ::isCallable() methods deprecated
2.ThinkPHP 解决模板文件大小写问题

5.致命错误: Class ‘app\Common\Controller\BaseController’ not found

这个错误,在windows上是没有问题的,但是到了CentOS8上,就是一个大问题,我看了看,其实是有 /cloud/master/PhServer/DingDing/application/Common/controller/BaseController,只不过其中的controller变成了小写罢了,这个问题真是难透了。

【解决方法】
临时解决方法,就是把相关的大些路径改为小写路径,这就是编码不规范导致的问题啊。真是接手别人的程序就是不行啊。

6.php 7.4 Array and string offset access syntax with curly braces is deprecated

还是版本的问题,原先的版本是 PHP 7.2.9,现在我安装的是PHP 7.4.3,看来还是要降啊。

找不到7.2.9,先是找了一个7.3.33版本,尝试一下吧。这要注意到是配置的编写: configure: WARNING: unrecognized options: –with-freetype, –enable-gd, –with-jpeg, –with-libxml, –with-zip,也就是说PHP8.0的.\configuration配置,不适合7.3.33了。

参考文章:
1.php 7.4 Array and string offset access syntax with curly braces is deprecated 直接降级了PHP版本

7.PDOException “could not find driver”

我要连接sql server数据库

(1) 安装pecl

1
yum install php-pear    

(2) 使用pecl安装
因为我的版本是7.3.33,不能用sqlsrv-5.9.0,只能降级

1
2
3
4
5
6
7
pecl install sqlsrv-5.8.0

pecl config-set php_ini /usr/local/php/etc/php.ini
pecl config-set ext_dir /usr/local/php
pecl config-set php_dir /usr/local/php
pecl config-set php_bin /usr/local/php/bin

不起作用

参考文章:
1.PDOException “could not find driver”
2.php通过pdo连接sql server数据库
3.5.9.0 for PHP Driver for SQL Server 微软官方驱动
4.How to install PECL on a linux system
5.tp5安装 sql server 提示could not find driver
6.Laravel配置和使用SqlServer,以及解决链接sqlsrv出现could not find driver
8.pecl安装php扩展
9.Setting up the SQLSRV extension for PHP 7.2 on Ubuntu 18.04.2 LTS
10.pecl 更换对应php版本 pecl配置php路径


【尝试操作】
下载包特别特别的慢,不知道为什么
(1) 手动下载 sqlserver的两个包,并进行解压

(2) 执行phpize

1
/usr/local/php/bin/phpize

结果

1
2
3
PHP Api Version:         20180731
Zend Module Api No: 20180731
Zend Extension Api No: 320180731

(3) 重新配置

1
./configure --with-php-config=/usr/local/php/bin/php-config

(4) 安装

1
make && make install

参考文章:
1.Linux下手动编译安装PHP扩展的例子分享 这里就是手动下载安装PDO_MYSQL的例子
2.当使用phpize的时候出现Can’t find PHP headers in /usr/include/php The php-devel package is required for use o 关于安装 PHP 扩展,以前总以为要重新编译 PHP,今天查阅大量资料发现原来可以像apache模块一样动态扩展。今天就以 oci8 举例。

【尝试方法】

1
2
curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssqlrelease.repo

参考文章:
1.当使用phpize的时候出现Can’t find PHP headers in /usr/include/php The php-devel package is required for use o
2.PHP7 安装sqlsrv、pdo_sqlsrv扩展 centos 这篇文章绝了

9.SQLSTATE[08001]

当我解决了上面的问题之后,进行程序运行,出现了这个问题:[Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol]

注意
因为我不断的重新安装openssl,不断的重复,修改连接,导致了我的 openssl 损坏了,系统多个库无法使用,我只能是重新安装了系统。所以轻易不要尝试修改系统依赖软件 openssl,否则后果很严重。

【尝试方案】
(1) 我尝试了密钥使用 SHA1 进行签名,结果无效

1
2
3
4
update-crypto-policies --set LEGACY

## 后来远程登录不上了我只能重新设置了
update-crypto-policies --set default

(2) 尝试查看 openssl 版本

1
2
3
4
# 查看 openssl 版本,结果报错了,我就把 /etc/pki/tls/openssl.cnf 删除了
openssl version
# 删除错误的配置,然后再次运行 openssl ,就会生成一个新的。
rm -rf /etc/pki/tls/openssl.cnf

(3) 替换文件

1
cp /etc/ssl/openssl.cnf /etc/ssl/openssl-bak.cnf

(4)编辑 openssl.conf
编写 /etc/ssl/openssl.conf 文件,增加如下内容,不知道为什么,我新装的CentOS8.0没有这个文件,但是我没有这个文件,只有 /etc/pki/tls 里面有一个 openssl.cnf文件,于是我修改了这个温文件,注释掉了这个,openssl_conf = default_modules,然后添加了新的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vi /etc/pki/tls/openssl.cnf
## openssl_conf = default_modules

## 新添加的内容
openssl_conf = default_conf

# 文件底部
[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1
CipherString = DEFAULT@SECLEVEL=1

[openssl_init]
providers = provider_sect

不知道为什么,以前我可以用这个解决,但是现在好像不行了,用了RockyLinux安装的。

(5)安装openssl1.0.2u
因为卸载是卸载不了的,只能是 高版本和低版本共存。

1
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
# #查找当前安装的OpenSSL版本
# rpm -qa|grep ssl
# #指定对应版本进行卸载
# yum -y remove openssl-3.0.7-28.el9_4.x86_64


#可以去该地址下载自己想要的版本的OpenSSl
https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz

#解压
tar -zxvf openssl-1.0.2u.tar.gz
#进入目录
cd openssl-1.0.2u/
#编译安装
./config --prefix=/usr/local/ssl
make && make install

# 备份
mv /usr/bin/openssl /usr/bin/openssl-bak
mv /usr/include/openssl /usr/include/openss-bak

#修改软连接
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
#查看版本
openssl version -a

(6) 安装openssl-1.1.1k

1
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
# 安装依赖
dnf install perl
# 0.下载,解压
https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -zxvf openssl-1.1.1k.tar.gz

# 1.备份
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak

# 2.编译,安装
cd openssl-1.1.1k
./config --prefix=/usr/local/openssl
make && make install

# 3.链接
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -sf /usr/local/openssl/include/openssl /usr/include/openssl


echo “/usr/local/openssl/lib” >> /etc/ld.so.conf
ldconfig -v

ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

# 4.检查
openssl version

(6) 安装openssl openssl-3.0.7
安装版本 openssl-3.0.7 (RockyLinux默认是3.0.7) 和安装前面的基本一样,不同的就是增加了 下面的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
tar -zxvf openssl-3.0.7.tar.gz
# 版本3
echo “/usr/local/openssl/lib64” >> /etc/ld.so.conf
# 原先指向的是 ls -L
ln -s /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3
# 原先指向的是 libcrypto.so.3.0.7
ln -sf /usr/local/openssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3

# 替换之后,我的 ssh 立马就端开了,但是还是没有解决问题, /lib64/libcrypto.so.3: version `OPENSSL_3.0.1' not found (required by /lib64/libssl.so.3)
cp /cloud/soft/openssl-3.0.0/libcrypto.so.3 /usr/lib/libcrypto.so.3
# 还是有问题
openssl version
# 解决方案
export LD_LIBRARY_PATH=/usr/local/openssl/lib64
# 取消设置
unset LD_LIBRARY_PATH

# 或者
echo "export LD_LIBRARY_PATH=/usr/local/openssl/lib64" >> ~/.bashrc
source ~/.bashrc

(7) 重新安装之后,结果还是报错了, undefined symbol: EVP_md2, version OPENSSL_3.0.0
这个问题我已经决定要放弃了,真是太浪费时间了,算了,也没有钱,反正系统也能正常的运行,就先这个样子吧。

参考文章:
【1】.SQLSTATE[08001]: [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol]
【2】. SSL routines:ssl_choose_client_version:unsupported protocol#1023
【3】.linux 下连接 sql server 数据库遇到了错误:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol 这里也是编辑了openssl.cnf文件
【4】.linux 使用openssl报找不到/usr/lib/ssl/openssl.cnf的解决办法
【5】.SQLSTATE[08001]: [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:0A000102:SSL routines::unsupported protocol] 这里也是在 Linux 上openssl.cnf通常是,/etc/ssl,在顶部openssl.cnf添加,底部添加
【6】.Rocky Linux 9 laravel 10(PHP8.3)连接SQL Server 数据库解决openssl 3.0.11 问题无法连接 执行下面命令,密钥使用 SHA1 进行签名
update-crypto-policies –set LEGACY
【7】.6.2. 更改系统范围的加密策略 update-crypto-policies –show
【8】.Getting docker-compose TypeError: kwargs_from_env() got an unexpected keyword argument ‘ssl_version’ in GitLab
【9】.PHP连接SQLSERVER出现SSL certificate报错 这里从代码的层面修改了问题。区别就是,18的encrypt默认配置改为1了,而17默认配置为0,所以在连接的时候,需要手动设置连接参数,这样就不会出现:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate。这样的报错了。
【10】.Error: TCP Provider: Error code 0x2746. During the Sql setup in linux through terminal 1.查看 openssl version。2.配置openssl。3.降级 openssl。4.downgrade Microsoft ODBC Driver 18 to 17。
【11】.Openssl install broken after dist upgrade
【12】.卸载安装替换为指定版本OpenSSL 这里卸载了 openssl-1.1.1g,安装了 1.0.2 版本
【13】.在CentOS7.9上 编译安装openssl-3.3.1+编译安装Nginx1.26.2 我们应该遵循的第一个原则就是:让新的openssl版本和老的openssl版本共存。我们应该采取以下策略来实现:1.使用独立的安装目录。2.修改应用程序的路径。3.使用符号链接。4.编译时指定 OpenSSL 路径。
【14】.openssl版本升级与降级 1.1.1升级3.1.1;3.1.1降级 1.1.1。
【15】.centos7 yum 安装 openssl 1.1.1k 最后一步 ln 建立符号链接 是为了让 python3.10 在 configure 时能找到 openssl 1.1.1
【16】.CentOS7.9下升级OpenSSL到OpenSSL 1.1.1k
【17】.Rocky Linux 安装 OpenSSL 1.1.1 ,Rocky Linux 9.1自带的Open SSL是3.0.7版本(如下图),但是有些程序依然依赖Open SSL 1.1.x版本,这就要求我们需要掌握在同一个主机下同时安装两个不同版本的OpenSSL方法。
【18】.OpenSSL 1.1.i and “Can’t locate FindBin.pm in @INC” 这里有讨论的出现问题:Can’t locate FindBin.pm,就是安装 perl。dnf install perl
【19】.[执行“openssl version“报openssl: /usr/lib/libcrypto.so.3: version `OPENSSL_3.1.0‘ not found (required by](https://blog.csdn.net/qq_41765969/article/details/127565952) 执行“sudo cp /home/zyf/sourceOpen/openssl/libcrypto.so.3 /usr/lib/libcrypto.so.3”之后,
【20】./lib64/libldap.so.2: undefined symbol: EVP_md2, version OPENSSL_3.0.0 after upgrading from F35 to F37 export LD_LIBRARY_PATH=/opt/openssl-1.1.1d/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
【21】.Compiling Openssl 3.0.8 on Rocky Linux 9 这里给我说的问题一样,“我需要运行一个需要这个新版本的应用程序”:在这种情况下,我建议编译新版本,但不要安装它(并破坏系统)。相反,将新的库文件收集到某处的本地文件夹中,并使用导出 LD_LIBRARY_PATH 环境变量使您的应用程序使用该文件夹作为库。或者,研究 docker/podman 并可能在隔离的容器中运行您的应用程序。
【22】.Rocky Linux 9 & RedHat 系 OpenSSH CVE-2024-6387 漏洞快速修复

10.windows和linux下的大小写问题,导致无法运行的问题

因为我拿到的是别人写的php程序,在windows上运行的好好的,我要移植到linux上,我遇到了这样的问题

定义了名字空间,对应于磁盘上的 application\Common\controller 文件夹

1
2
3
4
5
6
<?php
// 定义
namespace app\Common\Controller;

// 使用
use app\Common\Controller\BaseController;

这样写,在windows上运行没有问题,但是到了linux上,就会出现严重错误,导致程序找不到模块,无法运行,必须改为和磁盘上的大小写一致,改成 Common\controller 才可以。这个我真的非常的蛋疼,要改很多的东西,最后至于原因是什么,我暂时还没有深究,是在是忙不过来了。我已经通宵改了这些代码了。

11.count(): Parameter must be an array or an object that implements Countable

这个也是版本的问题吗?我真是醉了,我降级到了原先代码所在的php版本,还是不行,7.2.9。

【解决方法】
直接修改代码好了

1
2
3
4
// 源代码
count($variable)
// 改为
count(array($variable));

参考文章:
1.count(): Parameter must be an array or an object that implements Countable
2.count() parameter must be an array or an object that implements countable in laravel

12.undefined symbol: zval_ptr_dtor

这是在PHP7.2.29编译的时候使用的sqlsrv5.8.1时出现的问题,我已经重新编译安装了多次了,还是无法启动这个扩展,我以为是编译参数的问题, 我专门找了一个 PHP 7.2 的编译参数,也还是不行。

【解决方法】
最后是将sqlsrv 和 pdo_sqlsrv 也降级到了 5.8.0

参考文章:
1.PHP 7.2 Unable to load dynamic library - undefined symbol: call_user_function
2.由于出现“ zval_ptr_dtor”错误而无法加载SQLsrv
3.Linux下源码安装PHP 卸载PHP
4. Unable to load dynamic library ‘pdo_sqlsrv.so’/‘sqlsrv.so’ - No such file or directory - Debian 10.9 #1255 这里我也不知道到底是怎么解决的问题

13.configure: error: Cannot find ldap.h

如何配置的时候增加了:–with-ldap=shared –with-ldap-sasl 参数,则可能需要安装ldap这个插件。

1
2
## 安装openldap
yum install openldap openldap-devel -y

参考文章:
1.configure: error: Cannot find ldap.h 两个问题,一并解决了

14.Package ‘krb5-gssapi’, required by ‘virtual:world’, not found

编译安装的时候,出现了这个问题:Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix.

【尝试解决】
(1) 安装 cmake3,没有效果。

1
yum install cmake3; 

(2) 安装 gssapi,没有这个 libkrb5-dev 模块,gassapi 也安装失败。

1
2
3
yum install libkrb5-dev

pip3 install gassapi

【解决方案】
安装 krb5 模块

1
yum install krb5-workstation krb5-devel krb5-libs mod_auth_gssapi

参考文章:
【1】.PHP 7.4 installation error
【2】.How to install GSSAPI Python module? pip install gssapi
【3】.CentOS 7 GSSAPI module 安装了 krb5 模块

15.Package ‘libzip’, required by ‘virtual:world’, not found

编译 php8.3 的时候,出现了这个问题。

【解决方案】

1
yum install libzip libzip-devel

参考文章:
【1】.SOLVED Centos 7: Error build PHP 7.4 & 8.1

16.undefined reference to `EVP_PKEY_size’

Rocky Linux 9.0 编译 8.3.13 的时候,出现了问题,[Makefile:308: sapi/cli/php] Error 1,上面的一条错误是:undefined reference to `EVP_PKEY_size’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/cloud/soft/php-8.3.13/ext/openssl/xp_ssl.c:460: undefined reference to `sk_num'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/openssl/xp_ssl.c:476: undefined reference to `sk_value'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/openssl/xp_ssl.c:518: undefined reference to `sk_pop_free'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/openssl/xp_ssl.c:527: undefined reference to `sk_pop_free'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/openssl/xp_ssl.c:494: undefined reference to `sk_pop_free'
/usr/bin/ld: ext/phar/util.o: in function `phar_verify_signature':
/cloud/soft/php-8.3.13/ext/phar/util.c:1587: undefined reference to `EVP_MD_CTX_create'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/phar/util.c:1622: undefined reference to `EVP_MD_CTX_destroy'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/phar/util.c:1632: undefined reference to `EVP_MD_CTX_destroy'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/phar/util.c:1590: undefined reference to `EVP_MD_CTX_destroy'
/usr/bin/ld: ext/phar/util.o: in function `phar_create_signature':
/cloud/soft/php-8.3.13/ext/phar/util.c:1892: undefined reference to `EVP_MD_CTX_create'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/phar/util.c:1901: undefined reference to `EVP_PKEY_size'
/usr/bin/ld: /cloud/soft/php-8.3.13/ext/phar/util.c:1935: undefined reference to `EVP_MD_CTX_destroy'
/usr/bin/ld: ext/mysqlnd/mysqlnd_auth.o: in function `mysqlnd_caching_sha2_public_encrypt':
/cloud/soft/php-8.3.13/ext/mysqlnd/mysqlnd_auth.c:1012: undefined reference to `EVP_PKEY_size'
/usr/bin/ld: ext/mysqlnd/mysqlnd_auth.o: in function `mysqlnd_sha256_public_encrypt':
/cloud/soft/php-8.3.13/ext/mysqlnd/mysqlnd_auth.c:705: undefined reference to `EVP_PKEY_size'
collect2: error: ld returned 1 exit status
make: *** [Makefile:308: sapi/cli/php] Error 1

【问题说明】
这个问题主要是因为我重新从 openssl 3.0.8 降级到了 openssl 1.0.2,重新编译了 php 8.3.13,出现了这个问题,我准备把 php 降低到 7.2.x 版本。

【解决方案】
最后我也没有解决这个问题,因为我不断的重新安装openssl,不断的重复,修改连接,导致了我的 openssl 损坏了,系统多个库无法使用,我只能是重新安装了系统。

参考文章:
【1】.Make编译安装php出现collect2: ld returned 1 exit status make: *** [sapi/cli/php] Error 1的解决方法 「undefined reference to libiconv_open’」之类的错误信息
【2】.安装PHP出现make: *** [sapi/cli/php] Error 1 解决办法 编辑Makefile 大约77 行左右的地方: EXTRA_LIBS = ….. -lcrypt 在最后加上 -liconv,例如: EXTRA_LIBS = ….. -lcrypt -liconv 然后重新再次 make 即可。
【3】.undefined symbol: EVP_PKEY_sign
【4】.强烈建议使用维护的 OpenSSL 版本,否则 web 服务器很容易受到攻击。
【5】.Build failed on RHEL9 with OpenSSL 3
【6】.使用 phpipze 编译扩展报错的解决方法 这里遇到的问题和我的一模一样,我尝试了先去掉 –with-openssl,安装完成。安装完成后,我再通过 phpize 编译时,一切正常,当在 php.ini 文件中加上 openssl.so 时,就会报错,这个问题未能解决,如果你知道的话,不妨请赐教,谢谢!
【7】. 编译安装 PHP 7.0.3 亲测全攻略 & 以及如何单独的安装某个模块 需要进行操作make clean清除之前编译安装的中间文件
【8】.自己从源码编译一个新的openssl 编译php_openssl,链接新的openssl
【9】.[openssl编程编译错误undefined reference to `SSL_get1_peer_certificate‘解决方法](https://blog.csdn.net/sinat_41928334/article/details/124796389)
【10】.[SOLVED] Slackware 14.1 - OpenSSL-1.1.1 我找到了解决方案。旧的 evp.h 不包含这些函数,但新的包含。使用新版本的 openssl(截至目前为 3.3,是来自 git 的最新版本)构建二进制文件的临时解决方案是将整个 /include/openssl/* 复制到 /usr/include/openssl 但不是在创建之前复制整个原始目录的备份,以防其他内容损坏。或者在构建您想要的任何内容后,只需将原始文件夹复制回来即可。这样你就可以使用最新的 openssl 来构建你拥有的任何软件,但实际上不会破坏任何东西

17.ImportError: /lib64/libldap.so.2: undefined symbol: EVP_md2, version OPENSSL_3.0.0

一直弄 openssl ,结果导致系统的 openssl 不能用了。

【尝试方案】
(1)我从 3.0.0 安装到 3.0.14,后来又降到 3.0.7,结果还是一样的错误。
(2)重启系统,结果也还是有问题。

参考文章:
【1】.Remediating openssl 3.0.7 vulnerability
【2】.openssl: symbol lookup error: openssl: undefined symbol: EVP_mdc2, version OPENSSL_1_1_0 重新启动后已修复,但是存在另一个问题

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件(ititchuan@gmail.com)通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
ititchuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。