PHP交互式mysql()不起作用,但mysqli()正在工作; 为什么?

Jan*_*man 6 php mysql mysqli mariadb

概要:转储/恢复后,无法再从Web应用程序连接到MariaDB.这似乎是在MariaDB中处理PHP mysql()和mysqli()接口的方式之间的一些区别.

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

由于磁盘驱动器出现故障,我遇到了"数据库腐烂"的情况,一些InnoDB表变得无法访问,最后服务器崩溃了.我按照服务器错误日志条目指向的网页中的说明进行操作,并且能够让它运行,只读,使用"mysqld --innodb_force_recovery = 2".(1级仍然崩溃,我不敢尝试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(),而破碎的网页应用程序似乎正在使用mysql().phpMyAdmin有一个配置变量来控制它; 我把它从"mysqli"改为"mysql",它就破了.将其改回"mysqli",它再次起作用.

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

我想也许一些神奇的MySQL系统变量设置没有通过转储/恢复周期.

我做了phpinfo(),它表明mysqli()正在使用正确的套接字:/tmp/mysql.sock,但是mysql()正在使用/var/mysql/mysql.sock,这在/etc/php.ini中没有启用./ var/mysql中有一个指向/tmp/mysql.sock的符号链接,这让我觉得我之前已经走过了这条道路......我试着把它变成一个硬链接; 仍然没有快乐.

我运行了"php -info",实际上,编译后的套接字是/var/mysql/mysql.sock.所以我在/etc/my.cnf中放了"socket =/var/mysql/mysql.sock",删除了/ var/mysql中的符号链接,并重新启动了mysql和apache.套接字在/ var/mysql中.现在,使用mysqli()的web应用程序不再有效,但使用mysql()的应用程序也不行!

所以我很困惑.特别是因为在我进行了mysql数据目录的转储/初始化/恢复之前它一切正常.

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

(是的,我知道mysql()已被弃用,但我确实预先设置了"PHP 5.3.8".感谢所有没有回答问题的人指出不应该使用弃用代码进行新开发.现在,如果你这么聪明,我们试着回答这个问题吧!我有遗留的代码来维护!)

Jan*_*man 2

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

虽然我提到在 /etc/php.ini 中放置正确的套接字位置,但 phpinfo() 中的其他内容引起了我的注意:“扫描此目录以获取其他 .ini 文件:/usr/local/php5/php.d”。这显然是在读取主文件 /etc/php.ini之后完成的。啊。

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

我编辑了有问题的文件以指向/tmp/mysql.sock,并执行了“apachectl Graceful”,然后中提琴!(或者对于那些不喜欢弦乐器的人来说,瞧!)它又起作用了!

我不知道为什么在这两个位置之间既不创建硬链接也不创建符号链接(如我的问题中所述)解决了问题,我也不知道为什么简单的数据库转储/恢复会导致事情崩溃,经过多年的维持现状。我所知道的是,寻找并改变坏的插座位置可以解决问题。

因此,如果您的一个接口有问题,但另一个接口没有问题,请务必仔细阅读 phpinfo(),并检查所有修改 php 运行状态的位置,而不仅仅是/etc/php.ini。

非常感谢您的深思熟虑和有益的评论!