我正在尝试使用以下命令在后台处理文件,但它什么也不做。
exec("php csv.php $file $user > /dev/null &", $output);
如果我删除> /dev/null &
然后文件处理,但不在后台。
exec("php csv.php $file $user", $output);
有任何想法吗?
笔记:
如果使用此函数启动程序,为了使其继续在后台运行,程序的输出必须重定向到文件或另一个输出流。否则将导致 PHP 挂起,直到程序执行结束。
http://php.net/manual/en/function.exec.php
所以:
exec("php csv.php $file $user > /dev/null &"); // no $output
除了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
。
你考虑过使用屏幕吗?您可以启动在分离进程中运行的屏幕会话。输出将转到屏幕会话,您可以在它仍在运行时在另一个终端中重新附加到该会话。
exec("screen -d -m -S my_php_session csv.php $file $user", $output);