我正在使用task-spooler来排队一些视频编码任务(参见:http://manpages.ubuntu.com/manpages/artful/en/man1/tsp.1.html和http://vicerveza.homeunix.net/~viric/soft/ts/)
为了选择特定队列(而不是默认的每用户队列),二进制文件要求您设置指向套接字的环境变量。就我而言:TS_SOCKET=/tmp/reencode.socket
。然后运行tsp
显示该特定队列的状态。
此命令在终端中可以像任何用户一样工作:export TS_SOCKET=/tmp/reencode.socket ; tsp
我想创建一个显示此状态的基于Web的状态实用程序。但是,在apache2上使用php,使用相同的命令调用带有exec()
的bash脚本不起作用。 putenv('TS_SOCKET=/tmp/reencode.socket'); echo exec('tsp');
我也没有试过echo `export TS_SOCKET=/tmp/reencode.socket ; tsp`
在服务器上运行passthru('whoami')
表明它正在以用户www-root
(apache服务器用户)运行。如果我以该用户身份登录并运行该命令,它将按预期正常工作。
有趣的是,如果我运行php交互式shell(php -a
),我可以执行上述任何PHP代码并且它可以正常工作,所以它似乎与apache进行了一些交互。
这一切都在Ubuntu 17.10上运行,在PHP 2.4.27上使用PHP 7.1.11
答案 0 :(得分:6)
原来问题不在于设置环境变量,而在于访问套接字。由于apache正在通过systemd运行,因此它有一个独立的/tmp
(请参阅https://unix.stackexchange.com/questions/345122/why-php-can-not-see-tmp-files),它与我放置套接字的/tmp
不同。移动位置使一切正常!
答案 1 :(得分:1)
嗯,这个简单的测试用例似乎可以通过apache + mod_php(7.0)
工作<?php
header('content-type: text/plain; charset=utf-8');
$out = [];
exec('SOME_VAR=FOO && echo $SOME_VAR', $out);
// works too: exec('export SOME_VAR=FOO && echo $SOME_VAR', $out);
var_dump($out);
输出:
array(1) {
[0]=>
string(3) "FOO"
}
在你的情况下,这将是
<?php
header('content-type: text/plain; charset=utf-8');
$out = [];
exec('TS_SOCKET=/tmp/reencode.socket && tsp', $out);
// also try: exec('export TS_SOCKET=/tmp/reencode.socket && tsp', $out);
var_dump($out);