Пользовательский php.ini при выполнении php в качестве сценария оболочки

Я запускаю php как скрипт оболочки.

(Не уверен, что правильный сценарий оболочки. Файл начинается с #!/usr/bin/php )

Это отлично работает. Но класс MongoDB не загружается, поскольку правильный php.ini (с extension=mongo.so ) не используется.

Как я могу использовать этот php.ini?

Уже пробовал #!/usr/bin/php -c /usr/local/lib/php.ini

Но я все равно получаю ту же ошибку – Fatal error: Class 'Mongo' not found

Что может быть сделано?

В этой конкретной ситуации. я бы

  • Проверьте, загружен ли модуль Mongo (с помощью extension_loaded () или class_exists () )
  • Если не загружен, попробуйте загрузить модуль Mongo с помощью dl ()
  • Если загрузка не удалась, отобразите сообщение об ошибке, чтобы администратор мог позаботиться об этом ( STDERR или trigger_error ()

Большинство дистрибутивов уже отправляют разные версии php.ini для веб-серверов и CLI. Существуют ли другие причины для добавления другой конфигурации php.ini для скрипта XYZ (в дополнение к нормальной конфигурации)?

Попробуйте поместить php.ini в ту же папку, что и php-файл. Кажется, он выглядит там первым.

Я знаю это, потому что я использовал очень мощную и полезную программу командной строки, называемую strace, чтобы показать мне, что действительно происходит за моей спиной

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

Strace выкапывает вызовы ядра (системы), которые ваша программа создает и выгружает вывод в файл, указанный после -o

Легко использовать grep для поиска вхождений php.ini в этом журнале. Это довольно очевидно, глядя на следующий типичный ответ, чтобы увидеть, что происходит.

 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 

Это произошло из-за того, что у меня была такая же проблема. Проблема в том, что используется более одного файла php.ini.
Тот, который используется Apache, находится в

 /etc/php5/apache2/php.ini 

Это тот, который модифицирован для запуска MongoDB с расширением = mongo.so

Однако при запуске задания cron или из терминала он загружает другой файл ini. Вы можете найти это, используя строку

 grep php.ini strace.log 

Упомянутое выше @tomwrong

Путь, где он отображает «= 3», – это файл php.ini, загруженный при запуске движка с терминала, для этого ini-файла потребуется «extension = mongo.so».

Измените .bashrc, расположенный в вашем домашнем каталоге, и добавьте эту строку:

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

другой вариант – использовать небольшую оболочку sh, что-то вроде этого ниже в myapp.sh, не забудьте chmod + x на скрипте, чтобы запустить его

#!/usr/bin/env sh

SOMEVAR='Yea Baby!'

export SOMEVAR

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

с добавленным бонусом к возможности установки или переопределения env vars перед запуском