20

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

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

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

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

有任何想法吗?

4

3 回答 3

43

笔记:

如果使用此函数启动程序,为了使其继续在后台运行,程序的输出必须重定向到文件或另一个输出流。否则将导致 PHP 挂起,直到程序执行结束。

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

所以:

exec("php csv.php $file $user > /dev/null &"); // no $output
于 2013-01-28T05:38:58.190 回答
0

除了Emery King 的回答之外,您还必须使用单个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 $$ > pid将 的进程 ID 写入long_running_process名为pid.

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

  • sleep 10 && kill $(cat pid)在杀死文件中 ID 的进程之前等待 10 秒pid

于 2021-07-30T04:23:35.473 回答
0

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

exec("screen -d -m -S my_php_session csv.php $file $user", $output);
于 2015-10-11T00:29:46.270 回答