我正在尝试使用以下命令在后台处理文件,但它什么也没做。
exec("php csv.php $file $user > /dev/null &", $output);
如果我删除> /dev/null &
,则文件会处理,但不会在后台处理。
exec("php csv.php $file $user", $output);
有什么想法吗?
答案 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 $$ > pid
将 long_running_process
的进程 ID 写入名为 pid
的文件中。
> /dev/null 2>&1 &
将 stdout 和 stderr 重定向到 /dev/null
并将 long_running_process
置于后台。
sleep 10 && kill $(cat pid)
等待 10 秒,然后杀死 ID 在 pid
文件中的进程。