调用exec()后,如何强制PHP脚本继续使用脚本?

调用exec()后,如何强制PHP脚本继续使用脚本?,php,exec,Php,Exec,我正在使用PHP中的exec函数来运行命令。我正在运行的命令通常会花费相当多的时间,我不需要读取它的输出。有没有一种简单的方法告诉PHP不要等到exec命令完成后再继续脚本的其余部分?下面是我使用的方法,您可以使用exec或system来代替PaaStru: passthru("/path/to/program args >> /path/to/logfile 2>&1 &"); 以下是我使用的,您可以使用exec或system代替Paastru: passt

我正在使用PHP中的exec函数来运行命令。我正在运行的命令通常会花费相当多的时间,我不需要读取它的输出。有没有一种简单的方法告诉PHP不要等到exec命令完成后再继续脚本的其余部分?

下面是我使用的方法,您可以使用exec或system来代替PaaStru:

passthru("/path/to/program args >> /path/to/logfile 2>&1 &");

以下是我使用的,您可以使用exec或system代替Paastru:

passthru("/path/to/program args >> /path/to/logfile 2>&1 &");

您要查找的是一个异步调用,如下所示:


您要查找的是一个异步调用,如下所示:

运行nohup_test.php:

$ php nohup_test.php
run command: tail -f /dev/null
Continuing to execute the rest of this script instructions
让我们了解一下我们流程的PID:

$ ps auwx | grep tail
nemoden   3397  0.0  0.0   3252   636 pts/8    S+   18:41   0:00 tail -f /dev/null
$ ps auwx | grep php
nemoden   3394 82.0  0.2  31208  6804 pts/8    R+   18:41   0:04 php nohup_test.php
正如您所看到的,pid是不同的,我的脚本运行时没有等待tail-f/dev/null

运行nohup_test.php:

$ php nohup_test.php
run command: tail -f /dev/null
Continuing to execute the rest of this script instructions
让我们了解一下我们流程的PID:

$ ps auwx | grep tail
nemoden   3397  0.0  0.0   3252   636 pts/8    S+   18:41   0:00 tail -f /dev/null
$ ps auwx | grep php
nemoden   3394 82.0  0.2  31208  6804 pts/8    R+   18:41   0:04 php nohup_test.php

正如您所看到的,pid是不同的,我的脚本在运行时没有等待tail-f/dev/null。

也许可以作为一个单独的进程来执行它?我将如何执行该操作?我只是在命令的末尾附加&吗?execnohup$您的_命令&-run命令不受挂起的影响,输出到非tty nohup,在后台运行它&@Nemoden:Awesome!谢谢所以每次我打电话都会开始一个新的过程,对吗?有没有类似的方法可以在单独的线程上运行这些线程?是的,新进程将启动,我将在回答中演示。也许可以将其作为单独的进程来执行?我将如何执行?我只是在命令的末尾附加&吗?execnohup$您的_命令&-run命令不受挂起的影响,输出到非tty nohup,在后台运行它&@Nemoden:Awesome!谢谢所以每次我打电话都会开始一个新的过程,对吗?有没有类似的方法可以在不同的线程上运行它们?是的,新进程将启动,我将在回答中演示。谢谢!不过,我对这里的一些语法不太熟悉。>>和2>&1&do做什么?>>会将程序的输出发送到日志文件。“2>&1”会将错误消息重定向到标准输出,基本上意味着所有输出都将转到日志文件。“&”表示在后台运行命令。谢谢!不过,我对这里的一些语法不太熟悉。>>和2>&1&do做什么?>>会将程序的输出发送到日志文件。“2>&1”会将错误消息重定向到标准输出,基本上意味着所有输出都将转到日志文件。“&”表示在后台运行命令。谢谢!我在发帖前搜索了很多,但显然从未使用过正确的关键词…谢谢!我在发布之前搜索了很多,但显然从来没有使用过正确的关键字…使用/dev/null是正确工作的关键。由于某种原因,当我按照@zaf的建议指定了一个实际的日志文件位置,即/path/to/logfile时,PHP仍然在等待进程完成。知道为什么吗?如果您指定这样的日志文件:execnohup$command>/tmp/my.log 2>/dev/null&;然后运行php nohup_test.php,它不打印继续执行此脚本的其余指令?因为它工作得很好或者。。。应该这样工作。。。另一方面,使用/dev/null是使其正常工作的关键,这真的很奇怪。由于某种原因,当我按照@zaf的建议指定了一个实际的日志文件位置,即/path/to/logfile时,PHP仍然在等待进程完成。知道为什么吗?如果您指定这样的日志文件:execnohup$command>/tmp/my.log 2>/dev/null&;然后运行php nohup_test.php,它不打印继续执行此脚本的其余指令?因为它工作得很好或者。。。应该这样工作。。。否则真的很奇怪