2012-03-29 168 views
2

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

现在我可以通过将脚本包含在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 &"); 

或者你可以把它作为外壳。它适用于nix系统,但我的本地窗口是绝望的,所以如果有人在Windows上运行它,它的工作原理,请更新。

+0

创建另一个脚本工作者,由cron/windows调度器运行 – zerkms 2012-03-29 20:53:06

+0

这个的全部重点是不使用cron并且被用户触发。:) – Chris81 2012-03-30 14:31:03

回答

1

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

EXEC(“屏幕-d -m PHP运行时间长,script.php的”);

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

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

+0

请参阅下面请 – Chris81 2012-03-29 21:40:09

+0

exec(" screen -d -m php myfile.php "); 无法使用我自己的代码。如果我自己在浏览器中运行每个脚本,他们会做他们应该做的事情,但不是全部都链接在一起。对于nohub它会像 exec('nohup php myfile.php >/dev/null &'); ?谢谢 对不起,我不得不回答我的问题,因为代码被搞乱了。 – Chris81 2012-03-29 21:45:37

+0

我不明白你的意思是“连接在一起”..对于nohup - 是的,这是正确的方式(它主要是指“运行这个应用程序,不要告诉它,它的终端已经消失了(不要通过HUP信号))对于'屏幕'的东西不能工作 - 它可能没有安装在机器上 – 2012-03-29 21:51:28

4

我不会用shell exec来做这件事,因为你无法控制这些资源占用过程中有多少会在任何时候运行。因此,用户可以点击单击并单击并基本停止您的机器。

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

+0

嗨,亚历克斯,脚本是制约检查与数据库表检查时间间隔,数据库的大小和一些更多的东西。没有办法,用户可以启动相同的工作,如果它已经完成给定的条件。else语句会在数据库连接失败的情况下终止数据库连接。Cron作业完全没有问题,因为它被设置为在没有设置cron选项卡的情况下运行任何设置。 – Chris81 2012-03-29 21:04:15