web-dev-qa-db-ja.com

Wordpress / PHP-キャッチされないエラー:未定義の関数mysql_connect()の呼び出し

Wordpress私のVPS上のArchLinuxの下で、SQLバックエンドを設定し、/ usr/share/webapps/wordpress/wp-config.phpを編集しました。残念ながら、私がページにアクセスしようとすると取得...

_2019/06/14 06:44:12 [error] 20812#20812: *394 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function mysql_connect() in /usr/share/webapps/wordpress/wp-includes/wp-db.php:1645
Stack trace:
#0 /usr/share/webapps/wordpress/wp-includes/wp-db.php(639): wpdb->db_connect()
#1 /usr/share/webapps/wordpress/wp-includes/load.php(427): wpdb->__construct('wp-user', 'pc&0wC<k%:o<AuI...', 'wordpress', 'localhost')
#2 /usr/share/webapps/wordpress/wp-settings.php(120): require_wp_db()
#3 /usr/share/webapps/wordpress/wp-config.php(90): require_once('/usr/share/weba...')
#4 /usr/share/webapps/wordpress/wp-load.php(37): require_once('/usr/share/weba...')
#5 /usr/share/webapps/wordpress/wp-blog-header.php(13): require_once('/usr/share/weba...')
#6 /usr/share/webapps/wordpress/index.php(17): require('/usr/share/weba...')
#7 {main}
thrown in /usr/share/webapps/wordpress/wp-includes/wp-db.php on line 1645" while reading response header from upstream, client:...
_

これを検索すると、PHPがmysqliではなくmysqlモジュールを使用しようとしたときに発生します(スレッド here および here が見つかりました))。

/etc/php/php.iniでmysqliを有効にしました

_extension=mysqli
_

...そしてモジュールがロードされます...

_php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
hash
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
Phar
posix
readline
Reflection
session
SimpleXML
SPL
standard
tokenizer
xml
xmlreader
xmlwriter
Zip
zlib
[Zend Modules]
_

/usr/share/webapps/wordpress/wp-includes/wp-db.phpを問題のある行(1645)の周りで読むと、1589行目から始まる一連のif {} else {}ステートメントがあるように見えますuse_mysqliが使用されているかどうかを確認します。これは失敗し、mysqlモジュールが含まれていないため PHP7で削除されました で、代わりにmysqliを使用する必要があります。

_grep '\$this->use_mysqli' /usr/share/webapps/wordpress/wp-includes/wp-db.php -A100 -n | grep 1589 -A100
1589:           if ( $this->use_mysqli ) {
1590-                   $this->dbh = mysqli_init();
1591-
1592-                   $Host    = $this->dbhost;
1593-                   $port    = null;
1594-                   $socket  = null;
1595-                   $is_ipv6 = false;
1596-
1597-                   if ( $Host_data = $this->parse_db_Host( $this->dbhost ) ) {
1598-                           list( $Host, $port, $socket, $is_ipv6 ) = $Host_data;
1599-                   }
1600-
1601-                   /*
1602-                    * If using the `mysqlnd` library, the IPv6 address needs to be
1603-                    * enclosed in square brackets, whereas it doesn't while using the
1604-                    * `libmysqlclient` library.
1605-                    * @see https://bugs.php.net/bug.php?id=67563
1606-                    */
1607-                   if ( $is_ipv6 && extension_loaded( 'mysqlnd' ) ) {
1608-                           $Host = "[$Host]";
1609-                   }
1610-
1611-                   if ( WP_DEBUG ) {
1612-                           mysqli_real_connect( $this->dbh, $Host,    $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
1613-                   } else {
1614-                           @mysqli_real_connect( $this->dbh, $Host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );
1615-                   }
1616-
1617-                   if ( $this->dbh->connect_errno ) {
1618-                           $this->dbh = null;
1619-
1620-                           /*
1621-                            * It's possible ext/mysqli is misconfigured. Fall back to ext/mysql if:
1622-                             *  - We haven't previously connected, and
1623-                             *  - WP_USE_EXT_MYSQL isn't set to false, and
1624-                             *  - ext/mysql is loaded.
1625-                             */
1626-                           $attempt_fallback = true;
1627-
1628-                           if ( $this->has_connected ) {
1629-                                   $attempt_fallback = false;
1630-                           } elseif ( defined( 'WP_USE_EXT_MYSQL' ) && ! WP_USE_EXT_MYSQL ) {
1631-                                   $attempt_fallback = false;
1632-                           } elseif ( ! function_exists( 'mysql_connect' ) ) {
1633-                                   $attempt_fallback = false;
1634-                           }
1635-
1636-                           if ( $attempt_fallback ) {
1637:                                   $this->use_mysqli = false;
1638-                                   return $this->db_connect( $allow_bail );
1639-                           }
1640-                   }
1641-           } else {
1642-                   if ( WP_DEBUG ) {
1643-                           $this->dbh = mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
1644-                   } else {
1645-                           $this->dbh = @mysql_connect( $this->dbhost, $this->dbuser, $this->dbpassword, $new_link, $client_flags );
1646-                   }
1647-           }
_

/usr/share/webapps/wordpress/wp-includes/wp-db.phpをさらに振り返ると、行564で$ is_mysqlがnullに設定され、$ use_mysqliがfalseに設定されており、テストの理由を説明しているため、これは失敗します。 use_mysqliが使用されているかどうかを確認するのに失敗し、代わりにconnect_mysql()が試行されています...

_grep 'public \$is_mysql = null' /usr/share/webapps/wordpress/wp-includes/wp-db.php -A30 -n
564:    public $is_mysql = null;
565-
566-    /**
567-     * A list of incompatible SQL modes.
568-     *
569-     * @since 3.9.0
570-     * @var array
571-     */
572-    protected $incompatible_modes = array(
573-            'NO_ZERO_DATE',
574-            'ONLY_FULL_GROUP_BY',
575-            'STRICT_TRANS_TABLES',
576-            'STRICT_ALL_TABLES',
577-            'TRADITIONAL',
578-    );
579-
580-    /**
581-     * Whether to use mysqli over mysql.
582-     *
583-     * @since 3.9.0
584-     * @var bool
585-     */
586-    private $use_mysqli = false;
_

MysqlがPHP7以降削除されており、/ etc/php/php.iniにリストされている可能なモジュールではないことを考えると、新規インストールで$ use_mysqli = falseに驚いています。私はそれをtrueに設定しようとしましたが、php-fpm.serviceを再起動した後、別のエラーが発生し、if($ this-> $ use_mysqli){...}セクションを入力すると、$ this->への最初の呼び出しでのみ失敗しますdbh = mysqli_init()...

_2019/06/14 07:10:25 [error] 1439#1439: *1 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function mysqli_init() in /usr/share/webapps/wordpress/wp-includes/wp-db.php:1591
Stack trace:
#0 /usr/share/webapps/wordpress/wp-includes/wp-db.php(640): wpdb->db_connect()
#1 /usr/share/webapps/wordpress/wp-includes/load.php(427): wpdb->__construct('wp-user', 'pc&0wC<k%:o<AuI...', 'wordpress', 'localhost')
#2 /usr/share/webapps/wordpress/wp-settings.php(120): require_wp_db()
#3 /usr/share/webapps/wordpress/wp-config.php(90): require_once('/usr/share/weba...')
#4 /usr/share/webapps/wordpress/wp-load.php(37): require_once('/usr/share/weba...')
#5 /usr/share/webapps/wordpress/wp-blog-header.php(13): require_once('/usr/share/weba...')
#6 /usr/share/webapps/wordpress/index.php(17): require('/usr/share/weba...')
#7 {main}
  thrown in /usr/share/webapps/wordpress/wp-includes/wp-db.php on line    1591" while reading response header from upstream, client:
_

私は設定の変更に不利ではありませんが、 Arch Wiki:Wordpress 記事から得た印象は、このレベルのいじくりは必要ないということです。誰かが私がどこが間違っているのかについてアドバイスできますか?.

[〜#〜]編集[〜#〜]

phpinfo()のmysqliセクション

_mysqli
MysqlI Support  enabled
Client API library version  mysqlnd 5.0.12-dev - 20150407 - $Id: 7cc7cc96e675f6d72e5cf0f267f48e167c2abb23 $
Active Persistent Links     0
Inactive Persistent Links   0
Active Links    0
Directive   Local Value Master Value
mysqli.allow_local_infile   Off Off
mysqli.allow_persistent On  On
mysqli.default_Host no value    no value
mysqli.default_port 3306    3306
mysqli.default_pw   no value    no value
mysqli.default_socket   /run/mysqld/mysqld.sock /run/mysqld/mysqld.sock
mysqli.default_user no value    no value
mysqli.max_links    Unlimited   Unlimited
mysqli.max_persistent   Unlimited   Unlimited
mysqli.reconnect    Off Off
mysqli.rollback_on_cached_plink Off Off
_

EDIT2:_php-fpm_がmysqliモジュールをロードしていないことが示唆されたので、確認しましたが、 ...

_$ php-fpm -m
[PHP Modules]
cgi-fcgi
Core
ctype
curl
date
dom
fileinfo
filter
hash
json
libxml
mbstring
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
Phar
posix
readline
Reflection
session
SimpleXML
SPL
standard
tokenizer
xml
xmlreader
xmlwriter
Zip
zlib

[Zend Modules]
_
1
slackline

私はこれを解決し、根本的な問題はバックエンドmariadb/mysqlのpasswordでした。

レポートされたログからはまったく明確ではありませんでした...

PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function mysqli_init() in /usr/share/webapps/wordpress/wp-includes/wp-db.php:1591

しかし、私は物事を取り除き始め、mariadb.serviceが実行されていることを確認した後、コマンドラインから既存のパスワードを使用してwp-userとして接続しようとしましたが、失敗しました。パスワードを変更すると、コマンドラインで接続して/usr/share/webapps/wordpress/wp-config.phpの構成を完了することができました。\o /

0
slackline

あなたは正しい、このような干渉は必要ではないはずです。簡単なgrepは、_$use_mysqli_の621行目に_wp-db.php_が設定されていることを示しています。

_            // Use ext/mysqli if it exists unless WP_USE_EXT_MYSQL is defined as true
            if ( function_exists( 'mysqli_connect' ) ) {
                    $this->use_mysqli = true;

                    if ( defined( 'WP_USE_EXT_MYSQL' ) ) {
                            $this->use_mysqli = ! WP_USE_EXT_MYSQL;
                    }
            }
_

したがって、何らかの理由でWordPressは関数mysqli_connect()を見つけることができません。

mysqliモジュールがWebサーバー用にロードされていることを確認してください。コマンド_php -m_は、コマンドラインインターフェース用にロードされていることを確認するだけであり、異なる設定ファイルを使用する場合があります。これを確認するために、phpinfo()を使用してphpファイルを作成できます。 PHPでmysqliモジュールを有効にした後、Apacheを再起動することを忘れないでください。

ロードされてもエラーが発生する場合は、変数_WP_USE_EXT_MYSQL_をfalseに設定して、強制的にWordPressを使用してmysqliを使用することができます。これを追加するだけです。あなたのwp_config.phpに:

_define("WP_USE_EXT_MYSQL", false);
_
1