Instalei o Wordpress no ArchLinux no meu VPS, configurei o backend SQL e editei /usr/share/webapps/wordpress/wp-config.php. Infelizmente ao tentar acessar as páginas estou recebendo...
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:...
A pesquisa em torno disso parece acontecer em PHP quando está tentando usar o módulo mysql em vez de mysqli (encontrou threads aqui e aqui ).
Eu habilitei o mysqli em /etc/php/php.ini
extension=mysqli
...e o módulo está carregado...
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]
Lendo /usr/share/webapps/wordpress/wp-includes/wp-db.php em torno da linha incorreta (1645), parece-me que há uma série de instruções if{} else{} começando na linha 1589 que verifica se use_mysqli está sendo usado, isso falha e, como não há módulo mysql, eles foram removidos no PHP7 e mysqli deve ser usado.
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- }
Isso falha porque, olhando mais para trás em /usr/share/webapps/wordpress/wp-includes/wp-db.php, posso ver que $is_mysql está definido como null na linha 564 e $use_mysqli está definido como false, o que explica por que o teste para ver se use_mysqli está sendo usado falha e, em vez disso, connect_mysql() está sendo tentada ...
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;
Dado que o mysql foi removido desde o PHP7 e não é um módulo possível listado em /etc/php/php.ini, estou surpreso $use_mysqli = false em uma nova instalação. Eu tentei defini-lo como true e depois de reiniciar o php-fpm.service agora recebo outro erro e entre na seção if ( $this->$use_mysqli){...} apenas para falhar na primeira chamada para $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:
Não sou avesso a modificar a configuração, mas a impressão que tive do artigo do Arch Wiki: Wordpress é que esse nível de ajustes não é necessário. Alguém pode me dar uma dica de onde posso ter errado.
EDITAR
seção mysqli dephpinfo()
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 : Sugere-se que php-fpm
não estava carregando o mysqli
módulo, agora verifiquei e parece ...
$ 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]
Você está certo, intrometer-se assim não deve ser necessário. Um grep rápido mostra que
$use_mysqli
está definido na linha 621 emwp-db.php
:Então, por algum motivo o WordPress não consegue encontrar a função
mysqli_connect()
.Certifique-se de que o
mysqli
módulo está carregado para o servidor web. O comandophp -m
apenas confirma que foi carregado para a interface de linha de comando, que pode usar um arquivo de configuração diferente. Você pode criar um arquivo php comphpinfo()
para verificar isso. Não se esqueça de reiniciar seu Apache após habilitar o módulo mysqli no PHP.Se estiver carregado e você ainda encontrar o erro, você pode definir a variável
WP_USE_EXT_MYSQL
parafalse
forçar o WordPress a usar mysqli. Você só precisa adicionar isso ao seu wp_config.php:Eu resolvi isso e o problema subjacente era
password
o backend mariadb/mysql.Não ficou claro nos logs que relataram ...
No entanto, comecei a remover as coisas e, após a verificação
mariadb.service
, tentei conectar-me a elewp-user
com a senha existente na linha de comando e isso falhou. Alterar a senha me permitiu conectar na linha de comando e concluir a configuração do/usr/share/webapps/wordpress/wp-config.php
. \o/