apache php 执行 shell_exec或exec等linux命令时,一般是可以执行的,
但是碰到需要root权限的命令就执行不了了,
例如更新sphinx的索引:
using config file '/usr/local/coreseek/etc/csft.conf'...
indexing index 'xxxx'...
FATAL: failed to open /usr/local/coreseek/var/data/xxxx.tmp.spl: Permission denied, will not index. Try --rotate option.
因为apache执行命令时账号不是root, 而是一个自己的账号
<?php
$output = shell_exec('whoami');
echo "<pre>I am $output</pre>";
运行上面的php脚本,就可以看到账号,
或者进入/etc/apache2,打开apache2.conf(你的不一定是这个路径)
可以看到下面的内容:
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
那APACHE_RUN_USER是什么呢?
打开同一个目录下的envvars,
可以看到
export APACHE_RUN_USER=xxxxx
这个就是apache的账号了。
那现在我们有2种方法来解决更新sphinx索引的问题:
1.把apache账号提升到root权限
2.把索引分为全量索引和增量索引,通过计划任务去频繁地刷新增量索引
先采用把apache账号提升到root权限的方式,
vi /etc/sudoers
然后再执行之前的命令,注意加上sudo
$output = shell_exec('sudo sh /usr/local/coreseek/bin/refresh_sphinx.sh');
echo "<pre>$output</pre>";
indexing index 'xxxxx'...
collected 219167 docs, 27.6 MB
sorted 73.1 Mhits, 100.0% done
total 219167 docs, 27646228 bytes
total 29.438 sec, 939128 bytes/sec, 7444.99 docs/sec
total 8 reads, 0.237 sec, 52769.0 kb/call avg, 29.6 msec/call avg
total 998 writes, 0.616 sec, 889.3 kb/call avg, 0.6 msec/call avg
rotating indices: succesfully sent SIGHUP to searchd (pid=18165).
可以刷新索引了