我正在运行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
可以做些什么?
答案 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