Назад | Перейти на главную страницу

Wordpress / PHP - Неперехваченная ошибка: вызов неопределенной функции mysql_connect ()

Я установил Wordpress под ArchLinux на свой VPS, настроил серверную часть 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, когда он пытается использовать модуль mysql, а не mysqli (найденные потоки Вот и Вот).

Я включил mysqli в /etc/php/php.ini

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), мне кажется, что есть серия операторов if {} else {}, начинающихся со строки 1589, которые проверяет, используется ли 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, я вижу, что для $ is_mysql установлено значение null в строке 564, а для $ 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 статья заключается в том, что этот уровень переделок не требуется. Может ли кто-нибудь посоветовать, где я мог ошибиться.

РЕДАКТИРОВАТЬ

Раздел mysqli из phpinfo()

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

РЕДАКТИРОВАТЬ2 : Предполагается, что 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]

Вы правы, в таком вмешательстве нет необходимости. Быстрый 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 модуль загружен для веб-сервера. Команда php -m только подтверждает, что он загружен для интерфейса командной строки, который может использовать другой файл конфигурации. Вы можете создать файл php с помощью phpinfo() чтобы проверить это. Не забудьте перезапустить Apache после включения модуля mysqli в PHP.

Если он загружен и вы все еще сталкиваетесь с ошибкой, вы можете установить переменную WP_USE_EXT_MYSQL к false чтобы заставить WordPress использовать mysqli. Вам нужно только добавить это в свой wp_config.php:

define("WP_USE_EXT_MYSQL", false);

Я решил это, и основная проблема заключалась в password для бэкэнда mariadb / mysql.

Это было совершенно не ясно из журналов, в которых сообщалось ...

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 /