【问题标题】:PHP Warning: mysqli::__construct(): (HY000/2002): No such file or directory (Debian GNU/Linux 9)PHP 警告:mysqli::__construct(): (HY000/2002): 没有这样的文件或目录 (Debian GNU/Linux 9)
【发布时间】:2019-05-08 16:48:30
【问题描述】:

我在 Debian 9、Apache 2.4、PHP 7.2 上运行我的网站。 MySQL 数据库是远程的。该网站使用 mysqli 模块运行顺畅。但是当我尝试通过命令行运行 PHP 文件时,它会失败并显示错误:

PHP 警告:mysqli::__construct(): (HY000/2002): No such file or directory in ... 数据库连接失败:没有这样的文件或目录 (2002)

我一直在尝试运行的 PHP 文件开头有这一行:

require_once(__DIR__ . '/../private/initialize.php');

initialize.php 文件有这一行:$database = db_connect();,它调用了这些函数:

function db_connect() {
    $connection = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
    confirm_db_connect($connection);
    return $connection;
}

function confirm_db_connect($connection) {
    if ($connection->connect_errno) {
        $msg = 'Database connection failed: ';
        $msg .= $connection->connect_error;
        $msg .= ' (' . $connection->connect_errno . ')';
        exit($msg);
    }
}

出于安全原因,数据库凭据设置为常量,并通过以下代码从环境变量中获取:

define('DB_SERVER', getenv('DB_SERVER'));
define('DB_USER', getenv('DB_USER'));
define('DB_PASS', getenv('DB_PASS'));
define('DB_NAME', getenv('DB_NAME'));

通过export命令在/etc/apache2/envvars文件中定义的环境变量:

export DB_SERVER='*here db credential*'
export DB_USER='*here db credential*'
export DB_PASS='*here db credential*'
export DB_NAME='*here db credential*'

我检查了脚本是否正在使用环境变量,但它们没有。

echo getenv('DB_SERVER');
echo getenv('DB_USER');
echo getenv('DB_PASS');
echo getenv('DB_NAME');

好像是变量设置不当。

有人可以帮忙解决这个问题吗?我想从命令行运行带有 mysqli 扩展名的 PHP 文件,以便使用 CRON 作业。

提前致谢!

【问题讨论】:

  • 您无需修改​​配置文件;如果未加载模块,PHP 将失败并出现“未知函数”致命错误。您应该做的是检查 mysqli_* 函数中返回的错误,并向我们展示导致问题的代码。
  • 这听起来你需要在 php.ini 中为mysqli.default_socket 设置正确的值。未找到的文件是该行标识的 localhost 连接套接字。您需要检查您的 MySQL 配置以找出正确的套接字路径。或者,如果您的 MySQL 服务器正在侦听 TCP,请使用 127.0.01 而不是 localhost 作为连接主机。
  • 现在是 cron 问题 - 通过 cron 运行的 CLI php 可能(很可能)使用了一个 不同 php.ini 文件而不是 Web 服务器使用的文件,因此mysqli.default_sock 可能在一个位置正确,但在另一个 php.ini 位置不正确。从命令行检查php -i | less 并在顶部附近查找已加载的配置文件。在尝试使用 extension=mysqli 进行修改之前,您可能已经正确加载了扩展,但是套接字不正确。
  • @MichaelBerkowski 但我使用远程数据库。我应该不更改默认套接字,而是更改 php.ini 文件中的默认主机吗?
  • 嗨@miken32!我已经编辑了这个问题。也许现在它变得更清晰了。

标签: php mysqli command-line cron debian


【解决方案1】:

我解决了这个问题!

我在 cron 作业之前将变量放入 crontab -e 文件中,但没有使用 export 命令。

DB_SERVER='*here db credential*'
DB_USER='*here db credential*'
DB_PASS='*here db credential*'
DB_NAME='*here db credential*'

它使所有 cron 作业都可以访问变量。

所以当我使用 cron 作业时它工作得很好!

【讨论】:

  • 不要忘记确保权限为 600 且所有权适当,因此只有运行 cron 的用户才能访问它们。
猜你喜欢
  • 2019-07-27
  • 2021-01-09
  • 1970-01-01
  • 2017-06-12
  • 2018-08-08
相关资源
最近更新 更多