Php.ini personalizado ao executar o php como script de shell

Estou executando o PHP como um script de shell.

(Não há certeza se “script shell” estiver correto. O arquivo começa com #!/usr/bin/php )

Isso funciona muito bem. Mas a class MongoDB não é carregada porque o php.ini correto (tendo extension=mongo.so ) não é usado.

Como faço para usar esse php.ini?

Já tentou #!/usr/bin/php -c /usr/local/lib/php.ini

Mas eu ainda recebo o mesmo erro – Fatal error: Class 'Mongo' not found

O que pode ser feito?

Nesta situação particular. eu iria

  • Verifique se o módulo Mongo está carregado (usando extension_loaded () ou class_exists ( )
  • Se não estiver carregado, tente carregar o módulo Mongo usando dl ()
  • Se o carregamento falhar, exiba uma mensagem de erro para que o administrador possa cuidar dela ( STDERR ou trigger_error ()

A maioria das distribuições já envia versões diferentes do php.ini para Servidores Web e CLI. Existem outros motivos para adicionar outra configuração php.ini para o script XYZ (além da configuração normal)?

Tente colocar php.ini na mesma pasta que o PHP binário. Parece que parece primeiro.

Eu sei disso porque usei um programa de linha de comando muito poderoso e útil chamado strace para me mostrar o que realmente está acontecendo atrás das minhas costas

 $ strace -o strace.log php --version $ grep php.ini strace.log 

Strace escava as chamadas do kernel (sistema) que o seu programa faz e despeja a saída no arquivo especificado após -o

É fácil usar o grep para procurar ocorrências de php.ini neste log. É bastante óbvio, observando a seguinte resposta típica para ver o que está acontecendo.

 open("/usr/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/php.ini", O_RDONLY) = 3 lstat("/etc/php.ini", {st_mode=S_IFREG|0644, st_size=69105, ...}) = 0 

Cheguei por isso porque tive o mesmo problema. O problema é que existe mais de um arquivo php.ini usado.
O utilizado pelo Apache está localizado em

 /etc/php5/apache2/php.ini 

Este é o que é modificado para executar MongoDB com extensão = mongo.so

No entanto, ao executar um trabalho cron, ou do terminal, ele carrega um arquivo ini diferente. Você pode encontrar isso usando a linha

 grep php.ini strace.log 

Mencionado acima por @tomwrong

O caminho onde ele exibe ‘= 3’ é o arquivo php.ini carregado ao executar o mecanismo do terminal, esse arquivo ini também precisará “extensão = mongo.so”.

Edite .bashrc localizado em seu diretório inicial e adicione esta linha:

 alias php='php -c /path-to-custom/php.ini' 

a outra opção é usar um pequeno wrapper sh, algo assim abaixo em um myapp.sh, não se esqueça de chmod + x no script para executá-lo

#!/usr/bin/env sh

SOMEVAR='Yea Baby!'

export SOMEVAR

php -c /path/to/my/custom/php.ini /path/to/my/old_script.php

com o bônus adicional de ser capaz de definir ou superar os events anteriores