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

时间:2012-03-29 20:49:29

标签: php system exec shell-exec

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

现在我可以通过在if语句中包含脚本来实现这一点,但由于最终结果是占用MySQL转储的资源,我需要它独立于原始触发器页面运行。

此外,无论索引页面上的用户操作如何,这些脚本都应该在触发后继续执行操作。

最后一件事:它应该可以在win和nix上运行。

你会怎么做?

以下代码是否有意义?

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上运行它并且它可以工作,请更新它。

2 个答案:

答案 0 :(得分:4)

我不会通过shell exec执行此操作,因为您无法控制在任何时间运行多少资源占用进​​程。因此,用户可以点击 - 单击 - 单击并基本上停止您的计算机。

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

答案 1 :(得分:1)

我能想到的最简单的方法就是你可以做到

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

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

你也可以用'nohup php long-running-script.php'做你正在做的事情,或者编写一个简单的应用程序来执行daemonize()然后执行你的脚本。