我正在编写一个php脚本来与WordPress同步一些帖子,并且脚本应该通过终端执行。
<?php
require __DIR__ . '/../../wp-load.php';
echo 'WordPress loaded!' . PHP_EOL;
现在,当我执行脚本时:
php sync.php
我收到数据库连接错误。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Database Error</title>
</head>
<body>
<h1>Error establishing a database connection</h1>
</body>
</html>
然而,当我通过浏览器加载WordPress时,一切都很好。因此,我的数据库连接凭据有效。
/** The name of the database for WordPress */
define('DB_NAME', 'database-name');
/** MySQL database username */
define('DB_USER', 'root');
/** MySQL database password */
define('DB_PASSWORD', 'root');
/** MySQL hostname */
define('DB_HOST', 'localhost');
当我通过命令行运行它时,我有什么理由得到错误吗?
wp-load
的路径不是无效的,因为如果路径错误,或者找不到文件,我将无法打开流警告。例如,如果我将require
替换为以下内容(已删除一个/../
):
require __DIR__ . '/../wp-load.php';
然后我执行代码,收到以下警告:
PHP警告:要求(路径):无法打开流:第28行路径中没有此类文件或目录
答案 0 :(得分:1)
环境变量(如__DIR__
,连接设置(&#34; localhost&#34;和应用程序端口的解释,虚拟主机指令和目录根)都可以在两者之间变化。
您的路径在命令行和您的网络服务器(apache / nginx?)之间可能有所不同。仔细检查它们,看看你实际上要加载什么
其中一个与其他人不同:
/../../wp-load.php
__DIR__
回应realpath以查看正在发生的事情。
在浏览器和命令行中再次运行它。
// sync.php
<?php
echo __DIR__ . "\n";
echo realpath(__DIR__ . '/../'). "\n";
echo realpath(__DIR__ . '/../../'). "\n";
echo realpath(__DIR__ . '/../../wp-load.php'). "\n";
//require __DIR__ . '/../../wp-load.php';
//echo 'WordPress loaded!' . PHP_EOL;
注意:如果文件不存在,realpath
将返回 false 。
网络连接和访问权限可能因Web请求和CLI调用而异。这是由于两个主要因素:PHP将作为不同的用户运行,并且很可能被解释为从轻微不同的IP连接。
首先,检查MySQL日志是否有错误。在那里,你可能会发现Access denied for root@127.0.0.1:3306
的错误。这是由于用户仅被授予通过特定主机的访问权限。通过运行MySQL: SHOW GRANTS命令查看其中的内容。
这甚至可以通过connecting to MySQL via the CLI变得更加清晰:
# mysql --host=localhost --user=root --password=root database-name
[mysql_connect](http://se2.php.net/mysql_connect)
的一些测试可能会缩小您的问题范围:
function testConn(string $host) {
echo "\n\n MySql (".$host.") :\n";
$link = mysqli_connect($host, DB_USER, DB_PASS, DB_NAME);
if (!$link) {
echo "Error: Unable to connect to MySQL." . PHP_EOL;
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
exit;
}
echo "Success: A proper connection to MySQL was made! The my_db database is great." . PHP_EOL;
echo "Host information: " . mysqli_get_host_info($link) . PHP_EOL;
mysqli_close($link);
}
testConn(DB_HOST);
testConn('localhost');
testConn('127.0.0.1');
testConn('mydomain.com');
testConn('localhost:3306');
testConn('127.0.0.1:3306');
配置和环境变量的其他差异可能很难追踪。最好的起点是比较phpinfo();
的结果。