Linux安装PHP
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 | 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 |
缺什么依赖,就安装什么依赖
【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 | ## PHP 8.0配置 |
5.安装
1 | make && make install |
6.生成配置文件
1 | ## 生成php配置文件 |
7.启动
1 | /usr/local/php/daemon/php-fpm start |
【1】.php-fpm开机自启动详细教程
8.nginx配置
1 | server { |
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 | ## 加入微软源 |
一系列鬼操作,sqlserver的驱动终于是安装上了。
1.PHP7 安装sqlsrv、pdo_sqlsrv扩展 centos 这篇文章绝了
10.MySQL驱动
直接看下面的解决方案吧,因为mysql路径的问题,我没有重新编译成功mysql的驱动
可能我在编译的时候,没有把mysql的编译选项弄好,所以最后导致了没有mysql驱动,这是使用和安装sql server的方式类似的方法进行的,在安装编译完成了php之后,重新进行了mysql驱动配置。但是我在重新配置的时候,还是遇到了问题,就是这个 –with-pdo-mysql 参数的问题,我其实没有安装mysql的,这个时候该怎么指定mysql的路径呢?
1 | ## 安装mysql驱动 |
【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 | # find / -name 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 | extension=mysqli |
(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 | echo 'hello world' |
【尝试方法】
(1) nginx设置伪静态
1 | location / { |
(2) runtime目录设置读写权限
1 | chmod 777 -R runtime |
不起作用
(3) 开启调试模式
在 application/config.php中的app_debug配置参数,改为ture,就能在页面中看到剧透的错误了,而不是直接404错误。
1 | // 关闭调试模式 |
1.Thinkphp nginx 下 404 问题排查及解决 这里是说没有权限
2.thinkphp部署服务器后出现404错误 这提到了一个伪静态的问题,还有一个就是写权限的问题
3.7)调试模式
3.模块不存在
但我开启了 debug 模式之后,看到的错误消息,就是模版不存在
【尝试方法】
(1) 修改 application/config.php 文件
1 | ## 指向自己的模块名 |
(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了。
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 | pecl install sqlsrv-5.8.0 |
不起作用
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 | PHP Api Version: 20180731 |
(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 | 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 | update-crypto-policies --set LEGACY |
(2) 尝试查看 openssl 版本
1 | # 查看 openssl 版本,结果报错了,我就把 /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 | vi /etc/pki/tls/openssl.cnf |
不知道为什么,以前我可以用这个解决,但是现在好像不行了,用了RockyLinux安装的。
(5)安装openssl1.0.2u
因为卸载是卸载不了的,只能是 高版本和低版本共存。
1 | # #查找当前安装的OpenSSL版本 |
(6) 安装openssl-1.1.1k
1 | # 安装依赖 |
(6) 安装openssl openssl-3.0.7
安装版本 openssl-3.0.7 (RockyLinux默认是3.0.7) 和安装前面的基本一样,不同的就是增加了 下面的方法。
1 | tar -zxvf openssl-3.0.7.tar.gz |
(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 |
|
这样写,在windows上运行没有问题,但是到了linux上,就会出现严重错误,导致程序找不到模块,无法运行,必须改为和磁盘上的大小写一致,改成 Common\controller 才可以。这个我真的非常的蛋疼,要改很多的东西,最后至于原因是什么,我暂时还没有深究,是在是忙不过来了。我已经通宵改了这些代码了。
11.count(): Parameter must be an array or an object that implements Countable
这个也是版本的问题吗?我真是醉了,我降级到了原先代码所在的php版本,还是不行,7.2.9。
【解决方法】
直接修改代码好了
1 | // 源代码 |
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 | ## 安装openldap |
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 | yum install libkrb5-dev |
【解决方案】
安装 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 |
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 | /cloud/soft/php-8.3.13/ext/openssl/xp_ssl.c:460: undefined reference to `sk_num' |
【问题说明】
这个问题主要是因为我重新从 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 重新启动后已修复,但是存在另一个问题