Perguntas frequentes
Nesta página
Erros comuns de instalação de extensões
Cabeçalhos PHP não encontrados
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.
Vários tempos de execução PHP instalados
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>require(...); </pre>
Carregar uma query incompatível no Windows
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.
Tratamento e persistência de conexões
As conexões com o MongoDB deployment são tratadas pela libmongoc
biblioteca e pela extensão PHP. Quando você constrói uma MongoDB\Client
instância do, a biblioteca PHP cria uma instância MongoDB\Driver\Manager usando a mesma string de conexão e opções. A extensão também usa esses argumentos do construtor para derivar uma chave de hash para libmongoc
clientes persistentes. Se você persistiu anteriormente um libmongoc
cliente usando uma chave, ela será reutilizada. Caso contrário, um novo libmongoc
cliente é criado e mantido durante a vida útil do processo de trabalho PHP. Você pode saber mais sobre esse processo na documentação da extensão PHP.
Cada cliente do libmongoc
mantém suas próprias conexões com a implantação do MongoDB e uma visualização de sua topologia. Quando você reutiliza um cliente libmongoc
persistente, a biblioteca PHP pode evitar a sobrecarga de estabelecer novas conexões e redescobrir a topologia. Essa abordagem geralmente melhora o desempenho e é o comportamento padrão do driver.
Clientes persistentes libmongoc
não são liberados até que o processo de trabalho PHP termine. Isso significa que as conexões com uma implantação do MongoDB podem permanecer abertas depois que um objeto MongoDB\Driver\Manager
sair do escopo. Embora isso normalmente não seja um problema para aplicativos que se conectam a um sistema do MongoDB , pode ser problemático em algumas situações, descritas na lista a seguir:
O PHP-FPM é configurado com
pm.max_requests=0
, para que os trabalhadores nunca reapareçam, e um aplicação PHP é implantado muitas vezes com pequenas alterações em sua string de conexão ou opções do MongoDB . Isso pode levar a um acúmulo delibmongoc
objetos de cliente em cada processo de trabalho.Ocasionalmente, um aplicação se conecta a um sistema separado do MongoDB em um componente de backend onde a latência de solicitação não é o aspecto mais importante.
No primeiro caso, reiniciar o PHP-FPM como parte do sistema do aplicação permite que o aplicação libere todos os clientes libmongoc
não utilizados e ainda use um cliente persistente para a string de conexão mais recente.
O segundo caso exige uma solução diferente. A especificação de true
para a opção de driver disableClientPersistence
instrui a biblioteca PHP a criar um novo cliente libmongoc
e garantir que ele seja liberado quando o MongoDB\Driver\Manager
correspondente sair do escopo.
O código abaixo demonstra como definir a opção disableClientPersistence
como true
ao criar um cliente:
$client = new MongoDB\Client( uri: getenv('MONGODB_URI') ?: 'mongodb://127.0.0.1/', uriOptions: [], driverOptions: ['disableClientPersistence' => true], );
Use a opção de driver disableClientPersistence
após uma consideração cuidadosa, pois desativar a persistência do cliente requer mais tempo para estabelecer conexões com a implantação do MongoDB e descobrir sua topologia.
Falhas de seleção do servidor
Os itens a seguir são exemplos de falhas de seleção de 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 exceção do 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 em seu aplicação.
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 string de conexão 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.