Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该用“吗?”“现在”;还是使用符号(&;)在后台运行脚本?_Php_Linux_Shell - Fatal编程技术网

Php 我应该用“吗?”“现在”;还是使用符号(&;)在后台运行脚本?

Php 我应该用“吗?”“现在”;还是使用符号(&;)在后台运行脚本?,php,linux,shell,Php,Linux,Shell,我一直在寻找关于在后台运行php脚本的答案,它们似乎以两种方式传播 有些人建议使用以下方法(或类似方法): 其他建议使用“at”命令: 这两种方法的主要区别是什么?利与弊是什么 我要做的是,当用户提交表单时,我需要运行几分钟长的脚本,显然应该在后台运行。我尝试了两种方法,它们都对我有效,但我不确定选择哪一种。当您使用at命令调用它时,程序在后台由at守护进程执行 当您使用&时,进程仍然连接到当前shell。关闭shell时,进程将终止。您还可以执行nohoup/usr/bin/php命令,这样当

我一直在寻找关于在后台运行php脚本的答案,它们似乎以两种方式传播

有些人建议使用以下方法(或类似方法):

其他建议使用“at”命令:

这两种方法的主要区别是什么?利与弊是什么


我要做的是,当用户提交表单时,我需要运行几分钟长的脚本,显然应该在后台运行。我尝试了两种方法,它们都对我有效,但我不确定选择哪一种。

当您使用
at
命令调用它时,程序在后台由
at
守护进程执行


当您使用
&
时,进程仍然连接到当前shell。关闭shell时,进程将终止。您还可以执行
nohoup/usr/bin/php命令
,这样当您关闭shell时,进程将保持运行。

at命令是一个调度器,它接受stdin中的字符串或包含要在特定时间运行的命令的文件。你的例子是:

echo '/usr/bin/php command'| at now
将您的命令作为字符串提供给“at”命令,并安排它立即运行

第一种方法是通过shell对流程进行后台处理的典型方法:

/usr/bin/php command >/dev/null 2>&1 &
其中“>/dev/null”部分告诉shell将命令的stdout发送到/dev/null,而“2>&1”部分则告诉shell将命令的stderr输出发送到stdout(然后发送到/dev/null)。它们一起抑制输出。实际上,您可以通过以下步骤一步完成:

/usr/bin/php command &>/dev/null &                 # bash
结尾处的“&”告诉shell将进程作为背景

使用“at”的优点是可以灵活地安排命令在现在以外的时间运行(除其他外)。请阅读手册页。缺点是它可能不会安装在所有系统上


使用&via外壳的优点是,在背面接地本身没有开销。使用“at”立即运行命令有点过分,因为它涉及到为at创建一个新进程、调度命令、意识到它被设置为现在运行,然后在后台运行它。而在shell中运行带有“&”的命令只需在后台运行该命令。

我认为关闭shell问题就是关闭会话。在这种情况下,进程最终在Web服务器下运行,您不会期望脚本仅仅因为父线程(webserver/php)终止而死亡。但是,脚本将在没有父进程的情况下运行。at对这类事情唯一有用的时间是,如果您希望在收到大量请求时分散负载。。。例如:计划第一个现在开始,但第二个从现在开始5分钟,第三个10分钟。
现在
不会在夏令时切换回来的小时内立即执行(现在在欧盟)。我将在2:14第二次执行死刑!
/usr/bin/php command >/dev/null 2>&1 &
/usr/bin/php command &>/dev/null &                 # bash