PHP系统调用函数没有正确导出变量

时间:2018-02-15 01:34:03

标签: php bash apache

我正在使用task-spooler来排队一些视频编码任务(参见:http://manpages.ubuntu.com/manpages/artful/en/man1/tsp.1.htmlhttp://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

2 个答案:

答案 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);