WordPress wp-load抛出数据库错误

时间:2017-12-13 21:11:35

标签: php wordpress command-line-interface

我正在编写一个php脚本来与WordPress同步一些帖子,并且脚本应该通过终端执行。

sync.php

<?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行路径中没有此类文件或目录

1 个答案:

答案 0 :(得分:1)

Web服务器和CLI使用不同的配置运行

环境变量(如__DIR__,连接设置(&#34; localhost&#34;和应用程序端口的解释,虚拟主机指令和目录根)都可以在两者之间变化。

  1. 路径和目录根
  2. 连接设置
  3. 环境变量
  4. 路径和目录 - 根

    您的路径在命令行和您的网络服务器(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();的结果。