PHP 接口 mysql() 不工作,但 mysqli() 工作;为什么?

PHP interafce mysql() not working, but mysqli() is working; why?

概要:dump/restore 后无法再从 Web 应用程序连接到 MariaDB。这似乎是 PHP mysql() 和 mysqli() 接口在 MariaDB 中处理的方式之间的一些差异。

MacOS X 10.6.8 (Snow Leopard) 上的 MariaDB 10.1.8,PHP 5.3.8 和 Apache 2.2.24。

由于磁盘驱动器出现故障,我遇到了“数据库损坏”的情况,一些 InnoDB 表变得无法访问,最后导致服务器崩溃。我按照服务器错误日志条目指向的网页中的说明进行操作, 并且能够把它弄到 运行, read-only, using "mysqld --innodb_force_recovery=2". (Level 1 还是崩溃了,不敢尝试 level 3.)

在“force_recovery”模式下,我对所有数据库(11 GB)进行了逻辑(SQL代码)转储,重命名了故障数据目录,并且运行“scripts/mysql_install_db.sh” 来初始化一个空的数据目录。然后我加载了逻辑备份,只有一些小问题。

现在它变得令人费解。我可以很好地访问数据库,使用各种工具,包括 mysql CLI、phpMyAdmin、Sequel Pro、Valentia 等

但是我无法通过我托管的任何网站进入数据库,包括多个版本的 MediaWiki 和几个自制图像库的实例。它在 mysql_connect() 中失败,登录凭据通过 mysql CLI 工作。但是 phpMyAdmin 可以工作,使用相同的登录凭据!

所以我搜索了 phpMyAdmirn 代码,发现它使用的是 mysqli(),而损坏的 Web 应用程序似乎使用的是 mysql()。 phpMyAdmin 有一个配置变量来控制它;我将它从“mysqli”更改为“mysql”,但它坏了。将其改回“mysqli”,它再次起作用。

我没有更改任何 PHP 代码。我没有更改任何 apache 设置。我没有改/etc/my.cnf。我没有更改 /etc/php.ini。我没有更改任何登录凭据。唯一改变的是所有数据库的转储、重新初始化和恢复。

我在想,也许是一些神奇的 MySQL 系统变量设置没有通过 dump/restore 循环。

我执行了 phpinfo(),这表明 mysqli() 正在使用正确的套接字:/tmp/mysql.sock,但是 mysql() 正在使用 /var/mysql/mysql .sock,在 /etc/php.ini 中未启用。 /var/mysql 中有一个 symlink 指向 /tmp/mysql.sock,这让我觉得我以前一直走这条路......我试着让它变得困难 link;还是不开心。

我运行"php -info",果然编译入的socket是/var/mysql/mysql.sock。所以我把"socket=/var/mysql/mysql.sock"放在/etc/my.cnf里,删除了/var/mysql里的symlink,然后重启了mysql和apache。插座在 /var/mysql 中。现在,使用 mysqli() 的网络应用程序不再工作,但使用 mysql()!

的网络应用程序也不再工作

所以我很困惑。特别是因为在我对 mysql 数据目录执行 dump/init/restore 之前一切正常。

提前感谢您提供的任何建议!

(是的,我知道 mysql() 已被弃用,但我确实将 "PHP 5.3.8" 放在最前面。感谢所有没有指出应该回答问题的人不要将已弃用的代码用于新开发。现在,如果你这么聪明,让我们试着回答这个问题吧!我有遗留代码要维护!)

Warning This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide. Alternatives to this function include:

使用MySQLiPDO

mysqli_connect()

PDO::__construct()

在本例中,它是套接字位置。

虽然我提到在 /etc/php.ini 中放置正确的套接字位置,但 phpinfo() 中的其他内容引起了我的注意:"Scan this dir for additional .ini files: /usr/local/php5/php.d"。这显然是在 阅读主 /etc/php.ini 文件之后完成的。呃.

所以我进去了,果然,那里有一个文件将 mysql(但不是 mysqli)的套接字设置到错误的位置。 Double-ugh.

我编辑了有问题的文件以指向 /tmp/mysql.sock,然后 "apachectl graceful",中提琴! (或者对于那些不喜欢弦乐器的人,瞧!)它再次起作用了!

我不知道为什么在这两个位置之间既不创建硬 link 也不创建符号 link(如我的问题中所述)可以解决问题,我也不知道为什么经过多年的使用,我的数据库中的简单 dump/restore 会导致事情崩溃。我所知道的是,寻找并更改坏的套接字位置可以解决问题。

因此,如果您在一个界面上遇到问题,但在另一个界面上没有问题,请务必仔细阅读 phpinfo(),并检查 all修改 php 运行 状态的位置,不仅仅是 /etc/php.ini.

非常感谢您的周到和有益的评论!