【发布时间】:2023-03-21 22:56:01
【问题描述】:
我有一个安装了 Apache 和 MySQL 的实时托管服务器。如果我在 cli 上运行
mysql -u <username> -p
然后输入密码,我就登录成功了。如果我这样做了
mysql -u <username> -h localhost -p -P 3306 <dbname>
然后输入密码,我就成功连接到MySQL,也成功选择了数据库。所以,我实现了一个小的 php 文件,如下所示:
<?php
$result = mysqli_real_connect(mysqli_init(), 'localhost', '<username>', '<password>', '<databasename>', 3306);
echo var_dump($result);
我通过 cli 运行它:
php mytestfile.php
并成功连接数据库并显示结果
布尔(真)
但是,如果我尝试从网络浏览器加载相同的文件,那么结果是
布尔(假)
这清楚地表明从 cli 进行连接的相同尝试有效,而尝试通过 apache2 连接失败。试过了:
1。重启 Apache
service apache2 restart
2。重启 MySQL
service restart apache2
3。使用相同的 ini 文件
mv /etc/php/7.4/apache2/php.ini /etc/php/7.4/apache2/php.ini_old
cp /etc/php/7.4/cli/php.ini /etc/php/7.4/apache2/php.ini
service restart apache2
4。在线寻找答案
我找到了一些与 selinux 相关的答案,它们说我们需要允许网络访问 MySQL,但是,它们似乎与这个问题无关,因为我正在连接到 localhost,所以 MySQL 与 Apache 在同一台机器上运行.
5。比较套接字文件路径
mysql.sock 位于两个 php.ini 中完全相同的位置
6。比较20-mysqli.ini
他们是一样的
7.找出执行脚本的用户是谁
get_current_user()
当我从 cli 和 Apache 执行它时都会产生 root。
注意
这不是新安装。这长期正常工作,但是在一周内,在测试一些与 curl 相关的逻辑时,我震惊地发现我的爱好项目被破坏了。所以,决定在周末调查这个问题。然而,我所有的尝试都失败了。可能是什么问题?
请注意,这不是一个固执己见的问题,除了上面已经检查和列出的内容之外,我还会寻找要检查的内容。如果答案包含可能导致我遇到的问题的一个或多个元素的列表,则答案在客观上是正确的。只要我遇到的具体问题在列出的问题中,就会选择包含最详细描述和最多可能问题(除了我已经检查过的问题)的答案。
我不打算重新安装操作系统、Apache 或 MySQL。我知道如果我从服务器中清除所有内容并重新安装,那么这将起作用。但是,由于这是一个业余项目,我可以让它无限期地关闭,以便进行实验并找出问题所在。
我收到的错误消息是Permission Denied。
【问题讨论】:
-
尝试使用 apache 进行连接时会收到什么错误代码?
mysqli_connect_errno() -
@EnricoDias 权限被拒绝
-
@mario 我的权限被拒绝作为错误消息,忘记在问题中提及。将对其进行编辑以反映问题。
-
@LajosArpad 如果用户名/密码错误,或者 mysql 配置为拒绝来自特定主机的连接,您可能会收到权限被拒绝错误。看看是否有帮助:linuxize.com/post/mysql-remote-access
标签: php mysql ubuntu mysqli apache2