繁体   English   中英

php shell_exec()帮助,可在后台运行脚本

[英]php shell_exec() help needed for running a script in the background

我的项目要求使用if-else条件运行的3个php脚本。 第一个脚本加载到站点的索引页面上,以检查是否设置了条件,如果已设置,则调用第二个脚本。 第二个脚本检查是否设置了其他条件,如果一切正常,则最后调用最后一个脚本。

现在,我可以通过仅将脚本包括在if语句中来执行此操作,但是由于最终结果是占用资源的MySQL转储,因此我需要使其独立于原始触发器页面运行。

而且,无论索引页面上的用户操作如何,这些脚本一旦触发就应继续执行其操作。

最后一件事:它应该能够在胜利和尼克斯上运行。

你会怎么做?

下面的代码有意义吗?

if ($blah != $blah-size){
shell_exec ('php first-script.php > /dev/null 2>/dev/null &'); 
 }
//If the size matches, die
else {
 }

预先感谢一百万。

更新:以防万一其他人正在做同样的事情。 当以cgi身份运行脚本时,php中似乎存在一个错误,但是Apache的命令行可以与我测试过的所有版本一起使用。

看到错误https://bugs.php.net/bug.php?id=11430

所以我改为这样调用脚本:

exec("php-cli mybigfile.php > /dev/null 2>/dev/null &"); 

或者,您可以将其称为shell。 它可以在nix系统上运行,但是我的本地Windows绝望了,因此,如果有人在Windows上运行它并且可以运行,请进行更新。

我不会通过shell exec来执行此操作,因为您无法控制在任何一次运行这些资源占用过程中有多少个。 因此,用户可以单击,单击,单击,单击并实质上停止计算机。

相反,我会建立一个工作队列。 该脚本不是直接运行转储,而是将记录提交到某种FIFO队列(可以是数据库表或dir中某个地方的文本文件),然后立即返回。 接下来,您将有一个cron脚本,该脚本定期运行,并检查队列以查看是否有任何工作要做。 如果是这样,它将选择最旧的东西并运行它。 这样,可以确保您一次只运行一个转储。

我认为最简单的方法就是您可以

exec(“ screen -d -m php long-running-script.php”);

然后它将立即返回并在后台运行。 屏幕将允许您连接到它,并查看发生了什么。

您还可以使用'nohup php long-running-script.php'或通过编写一个简单的C应用程序(执行daemonize()然后执行脚本)来执行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM