-3

环境:os 和 apache 和 php 和 mariadb 版本。

uname -a
Linux MiWiFi-R3-srv 4.9.0-11-amd64 #1 SMP Debian 4.9.189-3+deb9u2 (2019-11-11) x86_64 GNU/Linux

sudo apachectl -v
Server version: Apache/2.4.25 (Debian)
Server built:   2019-10-13T15:43:54

php -v
PHP 7.0.33-0+deb9u6 (cli) (built: Oct 24 2019 18:50:20) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.33-0+deb9u6, Copyright (c) 1999-2017, by Zend Technologies

使用密码登录 mariadb 并输入status

Server:         MariaDB
Server version:     10.1.41-MariaDB-0+deb9u1 Debian 9.9

检查 php-mysql:

sudo dpkg -l php-mysql
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  php-mysql      1:7.0+49     all          MySQL module for PHP [default]

获取 mysql.so 库:

sudo find  /  -name  "*mysql.so"
/usr/lib/php/20151012/pdo_mysql.so

检查所有包含 mysql 的模块:

php -m |grep  mysql
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/php_pdo_mysql.so' - /usr/lib/php/20151012/php_pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
mysqli
mysqlnd
pdo_mysql


sudo vim  /etc/php/7.0/fpm/php.ini

改写

; ... or under UNIX:
;
;extension=mysql.so

作为

extension=mysqli.so

或者

extension=mysqlnd.so

或者

extension=pdo_mysql.so

重启apache2和mariadb数据库,问题依旧,三种格式都不行,怎么解决?

4

6 回答 6

9

pdo_mysql不一样mysql.so。旧的mysql扩展在 PHP 7.0 中被移除。支持的扩展现在只有mysqli.

从那里开始,它取决于软件期望找到的内容 - 如果它需要旧mysql库,那么您将不得不使用 shim 或较旧的 PHP 版本(即 PHP 7 之前的任何版本,例如 PHP 5.6)。

可以使用该php7-mysql-shimmysql-shim(请注意,这可能会导致较小的性能损失)来提供一个透明的映射,它将对旧库的任何调用调度mysql到仍然受支持的mysqli库。只要您php7-mysql-shim通过 composer 安装并且您的项目使用 composer,它应该会自动加载。

第三种选择是通过mysql-to-mysqlirector 配置运行原始代码,但如果这不是您自己的代码,将来将很难维护。

.so无法加载的文件可能是因为权限问题。确保ls -al该文件并更正任何所有权或权限问题(chmod og+r <filename>可能)。

于 2020-02-15T23:51:27.293 回答
1

避免使用会使您的应用程序支持旧驱动程序的快速修复。php-mysql将其从 中删除是有原因的php

您可以使用驱动程序的继任者,php-mysqlMySQLi名称MySQLi实际上意味着MySQL-improved并且您可以理解为MySQL驱动程序的改进版本,它为开发人员提供了更多好处。

您还可以使用 PHP 数据对象 (PDO),这是一个扩展,它定义了一个轻量级、一致的接口,用于PHP.

这意味着您将不得不重新编写与数据库处理信息相关的代码。如果你为它写了一个类,那么你只需要重写那个类。如果所有MySQL相关功能都编写在您的所有应用程序中,那么您有很多工作要做。

不要使用旧的 MySQL 扩展或通过使用快速修复来指出的东西

做一些你自己的进一步阅读,自己判断什么是这种情况的最佳实践,MySQLi WikiPDO 简介MySQLi 概述

于 2020-02-21T22:00:18.237 回答
0

正如其他人所说,尽管没有来源,但 mysql 扩展 (ext/mysql)在 5.5 中已弃用(根据RFC:ext/mysql deprecation)并在 7.0 中删除(根据RFC:在 PHP 7 中删除已弃用的功能)。

这是实际从 PHP 中删除 ext/mysql 的 git 提交,链接到删除 RFC - 此链接由 RFC 作者[nikic]添加)

在 php.net 上的ext/mysql 手册中也提到了这一点,尽管它没有链接到有关弃用和后续删除的任何其他注释。


如果您查看7.0 的向后不兼容更改页面,那么它会进一步提到所有 mysql 扩展功能都已删除,并提供一个链接以帮助选择新的 MySQL API。这提供了从 ext/mysql 继续前进所需的支持和路径。

于 2020-02-19T23:40:27.727 回答
0

MatsLindh 是对的,从 php 7 开始不推荐使用 mysql,看来您在服务器上部署了旧的 php5 代码,这就是您收到此错误的原因,现在您可以做两件事

  • 安装 php5.6 并根据您拥有的主机选择该网站文件夹的版本,然后重新启动服务器
  • 或者您可以自己或使用我不知道它是否完美运行的工具将代码升级到 php 7+,最近我遇到了这个 用于升级 php 遗留代码的 Rector Tool

前几个月我们走上了同样的道路,我们将 mysql 代码更新为 mysqli,还更新了类声明并添加了必要的检查,修复了错误处理,我们能够在 php 7 上成功运行旧版应用程序。有时候因为开发复杂,不可能瞬间升级,也不可能从头开始因为我们处理我们的高流量电子商务网站。

于 2020-02-16T18:50:34.050 回答
0

删除 php 和相关包。

sudo apt-get autoremove php7*
sudo find /etc -name "*php*" |xargs  rm -rf 
sudo apt purge `dpkg -l | grep php| awk '{print $2}' |tr "\n" " "`

查看。

dpkg -l | grep php7.0

安装。

sudo apt-get install php php-mysql

最后我的问题解决了。

于 2020-02-16T06:09:34.887 回答
0

您需要检查此问题的第一件事是 PHP 版本与现有 CMS 版本的兼容性。

在大多数情况下,仅由于此错误。

如果您正在使用域托管并且其中有一个不同的站点,您也可以仅通过此 Htaccess 文件在一个子域中切换 PHP 版本。

像这样 - FcgidWrapper "/home/httpd/cgi-bin/php53-fcgi-starter.fcgi" .php

谢谢你!

于 2020-09-09T04:56:37.637 回答