【发布时间】: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