【问题标题】:php shell_exec() help needed for running a script in the background在后台运行脚本所需的 php shell_exec() 帮助
【发布时间】:2012-04-13 13:38:24
【问题描述】:

我的项目需要 3 个使用 if-else 条件运行的 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 没有希望,所以如果有人在 Windows 上运行它并且它可以工作,请更新它。

【问题讨论】:

  • 创建另一个脚本工作者,由 cron/windows 调度程序运行
  • 这样做的重点是不使用 cron 并被用户触发。:)

标签: php system exec shell-exec


【解决方案1】:

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

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

【讨论】:

  • 嗨,Alex,脚本被安排检查数据库表以检查时间间隔、数据库大小和其他一些东西。如果在给定条件下已经完成,则用户无法启动相同的作业。如果条件不满足,else 语句将终止数据库连接。 Cron 作业是不可能的,因为它被设置为在任何设置上运行而无需设置 cron 选项卡。再次感谢
【解决方案2】:

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

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

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

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

【讨论】:

  • exec("screen -d -m php myfile.php");我自己的代码也不起作用。如果我自己在浏览器中运行每个脚本,他们会做他们应该做的事情,但并不是全部链接在一起。对于 nohub 会不会像 exec('nohup php myfile.php > /dev/null &'); ?谢谢 抱歉,我不得不回答我的问题,因为代码搞砸了。
  • 我不明白你所说的“链接在一起”是什么意思。对于 nohup - 是的,这是正确的方法(它主要意味着“运行这个应用程序并且不要告诉它它的终端是消失了(不要传递 HUP 信号))。对于“屏幕”的东西不起作用 - 它可能没有安装在机器上。
  • 感谢您的帮助 Vasil,这似乎是 php 本身的一个错误,我已经用解决方案更新了我原来的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多