php exec()后台进程问题

时间:2013-01-28 05:30:43

标签: php exec

我正在尝试使用以下命令在后台处理文件,但它什么也没做。

exec("php csv.php $file $user > /dev/null &", $output);

如果我删除> /dev/null &,则文件会处理,但不会在后台处理。

exec("php csv.php $file $user", $output);

有什么想法吗?

3 个答案:

答案 0 :(得分:25)

注意:

如果使用此功能启动程序,为了使其在后台继续运行,必须将程序的输出重定向到文件或其他输出流。如果不这样做将导致PHP挂起,直到程序执行结束。

http://php.net/manual/en/function.exec.php

这样:

exec("php csv.php $file $user > /dev/null &"); // no $output

答案 1 :(得分:0)

你考虑过使用屏幕吗?您可以启动在分离过程中运行的屏幕会话。输出将转到屏幕会话,您可以在另一个终端运行时重新连接到该屏幕会话。

exec("screen -d -m -S my_php_session csv.php $file $user", $output);

答案 2 :(得分:0)

除了 Emery King's answer 之外,您还必须使用单个 exec() 调用来终止后台进程。起初,我的印象是,如果将进程放在后台,只要我有进程 ID,我就可以继续我的快乐,然后将其杀死,但事实并非如此。

例如:

// Runs the background process for 10 seconds
// and then kills it and allows php to continue
exec('sh -c \'echo $$ > pid; exec long_running_process\' > /dev/null 2>&1 & sleep 10 && kill $(cat pid)');

// Runs the background process but does not allow
// php to continue until the background process finishes.
exec('sh -c \'echo $$ > pid; exec long_running_process\' > /dev/null 2>&1 &');
exec(' sleep 10 && kill $(cat pid)'); // <- does not execute until background process is done (at which point pid is already dead)
  • echo $$ > pidlong_running_process 的进程 ID 写入名为 pid 的文件中。

  • > /dev/null 2>&1 & 将 stdout 和 stderr 重定向到 /dev/null 并将 long_running_process 置于后台。

  • sleep 10 && kill $(cat pid) 等待 10 秒,然后杀死 ID 在 pid 文件中的进程。