Resolver problemas

PrestaShop: «An exception occurred while establishing a connection to figure out your platform version»

Revisto a 5 min de leitura MySQL compatibilidade PrestaShop

Se, ao instalar ou atualizar o PrestaShop, no passo que trabalha com a base de dados, aparecer um erro como este:

[WARNING] Some commands could not be registered. An exception occurred in ConnectionFactory.php
while establishing a connection to figure out your platform version.
You can circumvent this by setting a 'server_version' configuration value.
For further information, visit: https://github.com/doctrine/DoctrineBundle/issues/673.
In AbstractMySQLDriver.php, an exception occurred in driver:
SQLSTATE[HY000] [2026] SSL connection error: SSL_CTX_set_default_verify_paths failed.
The same error is repeated in Exception.php and PDOConnection.php:
SQLSTATE[HY000] [2026] SSL connection error: SSL_CTX_set_default_verify_paths failed.

o problema não é o MySQL nem os certificados do servidor: é um número mal interpretado na configuração do PrestaShop. Não lhe acontecerá se instalar com o instalador automático de aplicações do cPanel, mas, se lhe aparecer, tem duas soluções.

Porque acontece

O PrestaShop 1.7 e as versões 8.0 e 8.1 ativam a opção do MySQL MULTI_STATEMENTS escrevendo o seu número, 1013, em app/config/doctrine.yml. Esse número está correto com a extensão do PHP baseada no mysqlnd, mas a extensão pdo_mysql clássica numera as suas opções de outra forma: para ela, MULTI_STATEMENTS é a 1016 e a 1013 é o caminho dos certificados SSL (SSL_CAPATH).

Assim, o PrestaShop acaba por passar um caminho de certificados inválido à ligação, a ligação SSL falha e o Doctrine não consegue descobrir a versão do MySQL. Daí o SSL_CTX_set_default_verify_paths failed.

O PrestaShop corrigiu-o na 8.2, que usa o nome da constante em vez do número. Se atualizar a partir de uma versão anterior, o erro pode aparecer durante a atualização.

Solução 1: ativar a extensão nd_pdo_mysql (recomendada)

Substitua a extensão pdo_mysql pela nd_pdo_mysql em cPanel > Select PHP Version, no separador das extensões:

  1. Desmarque pdo_mysql.
  2. Marque nd_pdo_mysql.

Extensão nd_pdo_mysql marcada no Select PHP Version do cPanel

As alterações são guardadas automaticamente. A nd_pdo_mysql faz o mesmo que a pdo_mysql, mas usa a numeração que o PrestaShop espera (1013), pelo que não tem de mexer em nenhum ficheiro.

Se o seu domínio usar uma versão de PHP diferente da geral da conta, faça a alteração nessa versão. Tem a explicação em várias versões de PHP por diretório ou domínio.

Solução 2: editar o app/config/doctrine.yml

Use-a apenas se não puder alterar a extensão. Abra app/config/doctrine.yml com o gestor de ficheiros do cPanel e procure a secção options:

options:
  # PDO::MYSQL_ATTR_INIT_COMMAND
  1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
  # PDO::MYSQL_ATTR_MULTI_STATEMENTS
  1013: '%env(const:runtime:_PS_ALLOW_MULTI_STATEMENTS_QUERIES_)%'

Substitua o 1013 por 1016:

options:
  # PDO::MYSQL_ATTR_INIT_COMMAND
  1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
  # PDO::MYSQL_ATTR_MULTI_STATEMENTS
  1016: '%env(const:runtime:_PS_ALLOW_MULTI_STATEMENTS_QUERIES_)%'

Respeite a indentação com espaços: o YAML não admite tabulações. Depois esvazie a cache apagando o conteúdo de var/cache/ e repita a instalação ou a atualização.

O 1016 só está correto com a pdo_mysql. Se mais tarde ativar a nd_pdo_mysql, volte a colocar o 1013.

Verificar que funciona

Repita a instalação ou a atualização: o passo da base de dados deve ser concluído sem o aviso de platform version. Se a atualização tiver ficado a meio, reveja antes o seu registo e, se for preciso, restaure a cópia que fez antes de começar.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.