【问题标题】:Why is my correct connection attempt failing under apache2 but not under cli?为什么我的正确连接尝试在 apache2 下失败但在 cli 下失败?
【发布时间】: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

【问题讨论】:

标签: php mysql ubuntu mysqli apache2


【解决方案1】:

设法解决了问题,但我不能 100% 确定我是否正确确定了问题所在。基本上,为了解决这个问题,并且知道现代化永远不会受到伤害(特别是当事情已经坏了的时候),我已经将 PHP 升级到 8.0 版,但是/一些问题仍然存在,尽管提供了不同的错误消息,这就是说缺少某些文件夹。然后,我将连接设置中的主机从 localhost 更改为 127.0.0.1 并且它可以工作。

所以,我对问题的最佳猜测是,出于某种原因,localhost 已不再是正确的主机名,而 127.0.0.1是一个正确的主机名,所以我在调查过程中肯定错过的一个步骤是检查允许的主机是什么,因为我认为这没有改变。但是,即使我强烈怀疑这是问题的解决方案,但我实际上并不知道情况是否如此。在将 PHP 从 7.4 升级到 8.0 之前,尝试通过 Apache 运行时出现的错误消息是 Permission Denied,并且通过 cli 运行相同的 PHP 脚本运行良好。将 PHP 升级到 8.0 版后,相同的脚本响应了一条错误消息,指出缺少某些文件夹,但没有告诉我那个文件夹是什么,但将主机名从 localhost 更改为 127.0。 0.1 成功了。

https://www.tecmint.com/install-php-8-on-ubuntu/启发,我为解决问题而采取的步骤:

apt update
apt upgrade
apt install  ca-certificates apt-transport-https software-properties-common
add-apt-repository ppa:ondrej/php
apt update
apt install php8.0 libapache2-mod-php8.0
apt install php8.0-mysqli

注意:我是在 root 用户下进行这些操作的。如果您正在与其他用户进行升级,那么您需要使用 sudoer 进行升级,并且您可能需要在上述操作之前使用 sudo 关键字。

现在,运行 php -v 产生

但是,诀窍是更改我的设置文件,使其使用 127.0.0.1 作为主机值,而不是 localhost。这对我来说非常奇怪,因为之前相同的设置可以正常工作,只有我可以访问数据库,而且我当然没有更改允许的连接,而且通过 cli 我能够连接到 localhost 的事实增加了很多陌生感。

因此,总而言之,由于我的实验在得到任何有用的答案或提示之前就产生了结果,我决定自己写一个答案。但是,我很高兴接受一个比我自己对问题有更好理解的答案,因为这个答案诚然不包含对问题是什么的解释,因此,这个答案只有在有人提出适当的解释可能导致问题的原因,现已解决。

【讨论】:

    【解决方案2】:

    正如我在之前的 cmets 中所说,您的 mysql 不允许来自该特定主机的传入连接。 “本地主机”不同于 127.0.0.1。 “localhost”表示本地套接字连接,而 127.0.0.1 被视为 TCP/IP。

    直接在 cli 中执行 php 脚本可能会产生与使用 apache 执行不同的结果。一个执行可以尝试使用本地套接字连接,而另一个尝试使用 TCP。 apache 执行 php 的方式(即 mod_php、php_fpm 等)也可能在其中发挥作用,即使它们都使用相同的 php.ini。

    至于为什么它之前工作并突然停止;有些东西可能在你没有注意到的情况下发生了变化。我之前遇到过 mysql/mariadb 配置表的问题,甚至填写了错误报告,尽管与您的问题没有直接关系。

    【讨论】:

    • 为什么当我从通过 localhost 连接的 CLI 运行相同的 PHP 脚本时它会起作用?
    • “直接在 cli 中执行 php 脚本可能会产生与使用 apache 执行不同的结果。”是的,但它们都使用“localhost”作为主机进行连接。
    • php 可执行文件可能不同,apache 可以在执行期间覆盖 php.ini 配置。可能还有其他差异,因为某些 php 函数似乎可以识别代码何时在 cli 或 http 服务器中执行。
    • 两种情况下的可执行 PHP 文件完全相同。它使用“localhost”作为主机连接到 MySQL。如果“localhost”对于 MySQL 来说是不正确的主机,那么通过“localhost”连接到 MySQL 在尝试通过 Apache 和尝试通过 cli 运行 PHP 时都应该失败。除此之外,通过像mysql -u &lt;username&gt; -h localhost -p -P 3306 &lt;dbname&gt; 这样的cli 直接连接到MySQL 应该会失败。它没有失败,因此我们仍然缺少一些东西。我愿意接受你的回答,但问题还不清楚。
    • apache 在你的系统中使用的 php 位于 /etc/php/7.4/apache2/ 以及其他几个配置文件。您提到您将 php.ini 复制到 cli 文件夹中,仅此而已。您的设置中的某些内容可能会阻止 apache 执行的 php 使用套接字,无论是 apache 中的配置还是 apache 使用的 php 文件夹内的其他文件。无论哪种方式,最好记住 127.* 和 localhost 的行为不同。
    猜你喜欢
    • 1970-01-01
    • 2021-01-28
    • 2018-10-27
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多