【问题标题】:How to catch the result of a background PHP script launched from inside PHP?如何捕获从 PHP 内部启动的后台 PHP 脚本的结果?
【发布时间】:2013-04-24 16:54:37
【问题描述】:

我有一些 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——没有被创建。我已经尝试了execshell_execsystem 的所有变体,但它们都不会创建文件。 (现在,我将文件放入/tmp 以避免所有权/权限问题,顺便说一句。)我错过了什么吗?在这种情况下重定向会不起作用吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    .

    function fecho($data)
    {
      $fp = fopen('/tmp/code.out', 'a+');
      fwrite($fp, $data);
      fclose($fp);
    }
    

    【讨论】:

    • 我在想那个;它可能会起作用,但我真的更希望输出到标准输出——当我处理这些位时,它使调试/测试变得容易得多。无论如何, /tmp 像往常一样敞开,所以我看不出权限问题来自哪里。还是很疑惑……
    【解决方案2】:

    布鲁格。经过一天的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() 似乎都可以正常工作。

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

    【讨论】:

    • 恭喜您解决了问题。享受你的美酒吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多