0

我有一些我想作为后台进程运行的 PHP 代码。该代码检查数据库以查看它是否应该执行任何操作,然后在再次检查之前执行或休眠一段时间。当它做某事时,它会将一些东西打印到标准输出,因此,当我从命令行运行代码时,我通常会以明显的方式将 PHP 进程的输出重定向到一个文件:php code.php > code.log &.

从 shell 运行代码本身可以正常工作;我现在正试图让它在从 Web 进程启动时运行——我有一个页面可以确定 PHP 进程是否正在运行,并让我启动或停止它,具体取决于。我可以通过以下方式开始该过程:

$the_command = "/bin/php code.php > /tmp/code.out &";
$the_result = exec($the_command, $output, $retval);

但是(这就是问题所在!)输出文件/tmp/code.out————没有被创建。我已经尝试了、 和的所有变体exec,但它们都不会创建文件。(现在,我将文件放入以避免所有权/权限问题,顺便说一句。)我错过了什么吗?在这种情况下重定向会不起作用吗? shell_execsystem/tmp

4

2 回答 2

1

似乎是权限问题。解决此问题的一种方法是:

  1. 将您的echo($data)语句重命名为类似的函数fecho($data)
  2. 像这样创建一个函数 fecho()

.

function fecho($data)
{
  $fp = fopen('/tmp/code.out', 'a+');
  fwrite($fp, $data);
  fclose($fp);
}
于 2013-04-24T16:57:45.693 回答
0

布鲁格。经过一天的hack,这个问题终于解决了:

  • 我最初提出的方案(执行带有重定向的语句)工作正常......
  • ...除了它拒绝在 /tmp 中工作。我在服务器的网络空间之外创建了另一个目录并将其打开到 apache,一切正常。

为什么会这样,我不知道。但是给未来的访客一些注意事项:

  • 我正在运行一个非常普通的 Fedora 17、Apache 2.2.23 和 PHP 5.4.13。
  • 据我所知,我的 /tmp 配置没有什么异常(翻译:我从未修改过基本操作系统安装的任何设置)。
  • 我的 /tmp 有大量的目录形式/tmp/systemd-private-Pf0qG9/,其中后半部分是一组不同的随机字符。我在其中几个目录中发现了一些过时的日志文件版本。我认为这是某种我承认不理解的 Fedora 主义文件系统 juju,并且这些是我的一些进程黑客/杀戮留下的孤立文件。
  • exec(), shell_exec(), system(),passthru()一切似乎都奏效了,一旦我克服了困难。

底线:只要你在正确的地方做,应该有效的东西实际上是有效的。现在我会原谅自己照顾一大瓶印有我名字的酒,想想我的一天可能会如何度过......

于 2013-04-25T01:09:38.347 回答