在执行php作为shell脚本时自定义php.ini

时间:2011-01-02 14:56:08

标签: php

我正在运行php作为shell脚本。

(不确定“shell脚本”是否正确。文件以#!/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

可以做些什么?

6 个答案:

答案 0 :(得分:4)

尝试将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

答案 1 :(得分:3)

在这种特殊情况下。我会

大多数发行版已经为Web服务器和CLI提供了不同版本的php.ini。是否有其他原因为脚本XYZ添加另一个php.ini配置(除了正常配置)?

答案 2 :(得分:2)

遇到这个因为我遇到了同样的问题。问题是使用了多个php.ini文件 Apache使用的那个位于

/etc/php5/apache2/php.ini

这是修改为使用extension = mongo.so

运行MongoDB的那个

但是,在运行cron作业时,或从终端运行时,它会加载不同的ini文件。您可以使用

行找到它
grep php.ini strace.log

上面提到的@tomwrong

显示'= 3'的路径是从终端运行引擎时加载的php.ini文件,此ini文件也需要放置“extension = mongo.so”。

答案 3 :(得分:2)

编辑位于主目录的.bashrc并添加以下行:

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

答案 4 :(得分:1)

另一种选择是在myapp.sh中使用一个小的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预运行

答案 5 :(得分:0)

这对 PHP 来说有点问题。

php -c /path/to/my/custom/php.ini 从命令行工作。

但是在这样的脚本中尝试 #!/usr/local/bin/php -c /path/to/my/custom/php.ini 并且您的自定义 php 不会加载。

解决方案

去掉 -c 和路径之间的空格:

#!/usr/local/bin/php -c/path/to/my/custom/php.ini