Menu Docs
Página inicial do Docs
/ / /
Manual da Biblioteca PHP

Perguntas frequentes

Nesta página

  • Erros comuns de instalação de extensões
  • Cabeçalhos PHP não encontrados
  • Vários tempos de execução PHP instalados
  • Carregar uma query incompatível no Windows
  • Falhas de seleção do servidor

Por exemplo:

/private/tmp/pear/install/mongodb/php_phongo.c:24:10: fatal error: 'php.h' file not found
#include <php.h>
^~~~~~~

Este erro indica que o sistema de construção do PHP não consegue encontrar os cabeçalhos necessários. Todas as extensões PHP exigem cabeçalhos para compilar. Além disso, esses cabeçalhos devem corresponder ao tempo de execução do PHP para o qual a extensão será usada. Geralmente, o comando phpize (invocado por pecl) garantirá que a extensão seja construída com os cabeçalhos corretos.

Observe que a mera presença de um tempo de execução PHP não significa que os cabeçalhos estejam disponíveis. Em várias distribuições Linux, os cabeçalhos são frequentemente publicados em um pacote php-dev ou php-devel separado. No macOS, o tempo de execução padrão do PHP não inclui cabeçalhos e os usuários normalmente precisam instalar o PHP (e cabeçalhos) via Homebrew para construir uma extensão.

Se o seu sistema tiver múltiplas versões do PHP instaladas, cada versão terá seus próprios comandos pecl e phpize . Além disso, cada tempo de execução do PHP pode ter arquivos php.ini separados para cada SAPI (por exemplo FPM, CLI). Se a extensão tiver sido instalada, mas não estiver disponível no tempo de execução, verifique novamente se você usou o comando pecl correto e modificou o(s) arquivo(s) php.ini apropriado(s).

Se houver alguma dúvida sobre o php.ini arquivo que está sendo usado por um tempo de execução PHP, você deve examinar a saída de phpinfo() para esse SAPI específico. Além disso, php_ini_loaded_file() e php_ini_scanned_files() pode ser usado para determinar exatamente quais arquivos INI foram carregados pelo PHP.

Para depurar problemas com a extensão não sendo carregada, você pode utilizar o script detect-extension fornecido no diretório de ferramentas. Você pode executar esse script a partir da CLI ou incluí-lo em um script acessível por meio do seu servidor web. A ferramenta ponto possíveis problemas e instruções de instalação para seu sistema. Supondo que você tenha instalado a biblioteca por meio do Composer, você pode chamar o script a partir do diretório do fornecedor:

php vendor/mongodb/mongodb/tools/detect-extension.php

Se você quiser verificar a configuração de um servidor web SAPI, inclua o arquivo em um script acessível a partir do servidor web e abra-o no navegador. Lembre-se de encapsular o script em marcações <pre> para formatar corretamente sua saída:

<pre><?php require(...); ?></pre>

Os binários do Windows estão disponíveis para várias combinações de versão do PHP, segurança de thread (Typescript ou NTS) e arquitetura (x86 ou x64). Se o binário correto não for selecionado, resultará em um erro ao tentar carregar a query da extensão no tempo de execução:

PHP Warning: PHP Startup: Unable to load dynamic library 'mongodb'

Certifique-se de ter baixado uma query que corresponda às seguintes propriedades de tempo de execução do PHP:

  • Versão do PHP (PHP_VERSION)

  • Segurança de thread (PHP_ZTS)

  • Arquitetura (PHP_INT_SIZE)

Além das constantes mencionadas acima, essas propriedades também podem ser inferidas a partir de phpinfo(). Se o seu sistema tiver vários tempos de execução PHP instalados, verifique se você está examinando a saída phpinfo() para o ambiente correto.

O script detect-extension mencionado acima também pode ser usado para determinar aDLL apropriada para seu ambiente PHP.

Os itens a seguir são exemplos de falhas naseleção do servidor :

No suitable servers found (`serverSelectionTryOnce` set):
[connection refused calling hello on 'a.example.com:27017']
[connection refused calling hello on 'b.example.com:27017']
No suitable servers found: `serverSelectionTimeoutMS` expired:
[socket timeout calling hello on 'example.com:27017']
No suitable servers found: `serverSelectionTimeoutMS` expired:
[connection timeout calling hello on 'a.example.com:27017']
[connection timeout calling hello on 'b.example.com:27017']
[TLS handshake failed: -9806 calling hello on 'c.example.com:27017']
No suitable servers found: `serverselectiontimeoutms` timed out:
[TLS handshake failed: certificate verify failed (64): IP address mismatch calling hello on 'a.example.com:27017']
[TLS handshake failed: certificate verify failed (64): IP address mismatch calling hello on 'b.example.com:27017']

Esses erros normalmente se manifestem como uma MongoDB\Driver\Exception\ConnectionTimeoutException exceção da extensão. As mensagens de exceção reais são originadas da libmongoc, que é a biblioteca do sistema subjacente usada pela extensão. Como essas mensagens podem assumir várias formas, é útil detalhar a estrutura da mensagem para que você possa diagnosticar melhor os erros no aplicativo.

Normalmente, as mensagens começam com "Nenhum servidor adequado encontrado". A próxima parte da mensagem indica como a seleção do servidor falhou. Por padrão, a extensão evita um loop de seleção de servidor e, em vez disso, faz uma única tentativa (de acordo com a opção de connection string serverSelectionTryOnce ). Se a extensão estiver configurada para utilizar um loop, uma mensagem como "serverSelectionTimeoutMS expired" nos informará que esgotamos seu limite de tempo.

O último componente da mensagem nos informa por que a seleção do servidor falhou e inclui um ou mais erros diretamente do analisador de topologia, que é o serviço responsável por conectar e monitorar cada host. Qualquer host que tenha experimentado um erro pela última vez durante o monitoramento será incluído nesta lista. Essas mensagens normalmente se originam de funções de soquete ou TLS de baixo nível.

O seguinte não pretende ser exaustivo, mas espera-se que direcione você na direção correta para analisar os fatores que contribuem para uma falha de seleção de servidor:

  • "conexão recusada" provavelmente indica que o host remoto não está escutando na porta esperada.

  • "tempo limite de conexão" pode indicar um problema de roteamento ou firewall, ou talvez um tempo limite devido à latência.

  • "tempo limite do soquete" sugere que uma conexão foi estabelecida em algum ponto, mas foi descartada ou atingiu o tempo limite devido à latência.

  • "Falha no handshake TLS" sugere algo relacionado à verificação TLS ou OCSP e, às vezes, é indicativo de certificados TLS configurados incorretamente.

No caso de uma falha de conexão, você pode utilizar a ferramenta connect para tentar receber mais informações. Essa ferramenta tenta se conectar a cada host em uma string de conexão usando funções de soquete para ver se ela é capaz de estabelecer uma conexão, enviar e receber dados. A ferramenta usa a string de conexão para um sistema do MongoDB como seu único argumento. Supondo que você tenha instalado a biblioteca por meio do Composer, chame o script a partir do diretório do fornecedor:

php vendor/mongodb/mongodb/tools/connect.php mongodb://127.0.0.1:27017

Caso o servidor não aceite conexões, a saída será assim:

Looking up MongoDB at mongodb://127.0.0.1:27017
Found 1 host(s) in the URI. Will attempt to connect to each.
Could not connect to 127.0.0.1:27017: Connection refused

Observação

A ferramenta suporta apenas o esquema URI mongodb:// . A utilização do esquema mongodb+srv não é suportada.

Voltar

Atualizar versões da biblioteca