如何捕获从PHP内部启动的后台PHP脚本的结果?

时间:2013-04-24 16:54:38

标签: php file shell shell-exec io-redirection

我有一些我希望作为后台进程运行的PHP代码。该代码检查数据库以查看它是否应该执行任何操作,并在再次检查之前执行该操作或暂停一段时间。当它执行某些操作时,它会向stdout输出一些内容,因此,当我从命令行运行代码时,我通常会以明显的方式将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 - 没有被创建。我已经尝试了execshell_execsystem的所有变体,但没有一个会创建该文件。 (现在,我将文件放入/tmp以避免所有权/许可问题,顺便说一句。)我错过了什么吗?在这种情况下,重定向是否会起作用?

2 个答案:

答案 0 :(得分:1)

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

  1. 将您的echo($data)语句重命名为fecho($data)
  2. 等函数
  3. 像这样创建一个函数fecho()
  4. function fecho($data)
    {
      $fp = fopen('/tmp/code.out', 'a+');
      fwrite($fp, $data);
      fclose($fp);
    }
    

答案 1 :(得分:0)

Blurgh。经过一天的黑客攻击后,这个问题终于得到了解决:

  • 我最初提出的方案(执行声明的一个 重定向)工作正常......
  • ...除了它拒绝在/ tmp中工作。一世 在服务器的网站空间外创建另一个目录并打开 它取决于apache,一切正常。

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

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

底线:只要你在正确的地方做了,事实上应该做什么工作。我现在要原谅我要照顾一大瓶装有我名字的葡萄酒,并想想我的日子本来可能会花费多少......