WordPress/PHP – Eroare neacoperită: Apel la o funcție nedefinită mysql_connect() (Administrarea sistemului, Mysql, Php, WordPress)

slackline a intrebat.
a intrebat.

Am instalat WordPress sub ArchLinux pe VPS-ul meu, am configurat backend-ul SQL și am editat /usr/share/webapps/wordpress/wp-config.php. Din păcate la încercarea de a accesa paginile primesc…

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:...

Căutând în jur se pare că acest lucru se întâmplă sub PHP atunci când încearcă să folosească modulul mysql mai degrabă decât mysqli (am găsit discuții aici și aici).

Am activat mysqli în /etc/php/php.ini

extension=mysqli

…și modulul este încărcat…

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]

Citind prin /usr/share/webapps/wordpress/wp-includes/wp-db.php în jurul liniei incriminate (1645) mi se pare că există o serie de declarații if{} else{} începând cu linia 1589 care verifică dacă use_mysqli este utilizat, acest lucru nu reușește și, deoarece nu există nici un modul mysql în ele a fost eliminat în PHP7 și mysqli ar trebui să fie utilizat în schimb.

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-           }

Acest lucru eșuează deoarece, dacă mă uit mai departe în /usr/share/webapps/wordpress/wp-includes/wp-db.php, pot vedea că $is_mysql este setat la null pe linia 564 și $use_mysqli este setat la false, ceea ce explică de ce testul pentru a vedea dacă use_mysqli este utilizat eșuează și în schimb se încearcă 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;

Având în vedere că mysql a fost eliminat din PHP7 și nu este un modul posibil listat în /etc/php/php.ini, sunt surprins că $use_mysqli = false la o instalare nouă. Am încercat să îl setez la true și după ce am repornit php-fpm.service acum primesc o altă eroare și intru în secțiunea if ( $this->$use_mysqli){…} doar pentru a eșua la primul apel la $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:

Nu sunt împotriva modificării configurației, dar impresia pe care am avut-o de la Arch Wiki : WordPress articol este că acest nivel de tinkering nu este necesar. Poate cineva să mă sfătuiască unde aș fi putut greși.

EDITARE

secțiunea mysqli din 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

EDIT2 : Este sugerat că php-fpm nu a fost încărcarea mysqli modul, am verificat acum și se pare că…

$ 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]

3 răspunsuri
Gerald Schneider

Aveți dreptate, o astfel de intervenție nu ar trebui să fie necesară. Un grep rapid arată că $use_mysqli este setat în linia 621 din 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;
                    }
            }

Deci, dintr-un motiv oarecare, WordPress nu poate găsi funcția mysqli_connect().

Vă rugăm să vă asigurați că mysqli modulul este încărcat pentru serverul web. Comanda php -m confirmă doar că este încărcat pentru interfața de linie de comandă, care poate utiliza un fișier de configurare diferit. Puteți crea un fișier php cu phpinfo() pentru a verifica acest lucru. Nu uitați să reporniți Apache după ce ați activat modulul mysqli în PHP.

Dacă acesta este încărcat și încă întâmpinați eroarea, puteți seta variabila WP_USE_EXT_MYSQL la false pentru a forța WordPress să utilizeze mysqli. Trebuie doar să adăugați acest lucru în wp_config.php:

define("WP_USE_EXT_MYSQL", false);

Comentarii

  • Vă mulțumim pentru răspunsul rapid, phpinfo() aici arată că configure are '--with-mysqli=shared,mysqlnd' și mai jos există o secțiune pentru mysqli care arată directive mysqli_connect nu este listată acolo. Am repornit php-fpm.service și nginx.service dar tot primesc Error establishing a database connection returnat și acum nimic în /var/log/nginx/error.log (deși /var/log/nginx/access.log înregistrările încearcă să vizualizeze pagina). –  > Por slackline.
  • Ieșirea din phpinfo() confirmă faptul că modulul mysqli nu este încărcat. Ar trebui să existe o secțiune cu acest nume care să arate unele dintre opțiunile mysqli. Găsiți fișierul de configurare corect al php-fpm-ului dvs. (Rezumatul pachetului arată câteva fișiere și directoare numite php-fpm în /etc/php/) și activați-l. –  > Por Gerald Schneider.
  • Am găsit o secțiune intitulată mysqli deși multe dintre valori sunt Null (/no value). Este activarea mysqli sub /etc/php/php-fpm.conf este aceeași ca și pentru /etc/php/php.conf așa cum am făcut mai sus, adică doar adăugând extension=mysqli? EDIT : Nu este așa, am adăugat linia și nu reușește să pornească, am plecat să citesc Configurația php-fpm –  > Por slackline.
  • Am încercat să adaug echo 'extension=mysqli' > /etc/php/conf.d/mysql.ini dar nici asta nu funcționează. –  > Por slackline.
  • Ok, am verificat și php-fpm -m (ieșire adăugată mai sus) listează mysqli, , mysqlnd și pdo_mysql ca module care sunt utilizate. Aceasta este cea implicită, deoarece am eliminat /etc/php/conf.d/mysql.ini pe care l-am creat. –  > Por slackline.
slackline

Am rezolvat acest lucru și problema de bază a fost password pentru backend-ul mariadb/mysql.

Nu a fost deloc clar din jurnalele care au raportat…

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

Cu toate acestea, am început să desființez lucrurile și după ce am verificat mariadb.service era în funcțiune a încercat să se conecteze la el ca wp-user cu parola existentă din linia de comandă și acest lucru a eșuat. Schimbarea parolei mi-a permis să mă conectez de la linia de comandă și să completez configurația de /usr/share/webapps/wordpress/wp-config.php. o/

Trif
sudo apt-get install php7.4-mysql
sudo service apache2 restart

Comentarii

  • Mulțumesc, deși, așa cum am scris în deschidere, folosesc ArchLinux și nu o distro bazată pe Debian/Debian și am rezolvat deja problema așa cum am postat, era o problemă de parolă la MariaDB pentru wp-user. –  > Por slackline.