【问题标题】:Run PHP when a variable changes当变量改变时运行 PHP
【发布时间】:2015-03-24 10:19:52
【问题描述】:

我的 php 代码有问题。当变量发生变化时,我想在我的数据库中添加一些东西。我从另一个发生变化的文件中获取了一个变量。

您可以在下面找到代码:

$urlMachineON = 'http://192.168.0.150/awp/Shredder/PLCfiles/IOmachineActive.html';

// get content
$contentMachineON = file_get_contents($urlMachineON);

//remove first 2 characters
$truncate = substr($contentMachineON, 2);

//remove last 5 characters
$MachineOn = substr($truncate, 0, -5);

if ($MachineOn == 0)
{
    echo "de machine staat uit";
    //Send information to the database
    //example: current time + MachineStatus(off) + message(Machine offline Error X)
}
elseif($MachineOn == 1)
{
    echo "de machine staat aan";
    //Send information to the database
    //example: current time + MachineStatus(on) + message(Error X is solved)
}

当我这样做时,它只会在我刷新网页或使用某种按钮时在我的数据库中设置信息。但它必须自动进行。因此,当变量$MachineOn 从 0 变为 1 或 1 变为 0 时,它必须在我的数据库中添加信息。我该如何解决这个问题?

【问题讨论】:

  • 在 Linux 上使用任务调度程序(如 cron)定期运行您的脚本。
  • 正如@jeroen 所说,您希望根据您的托管运行cronjob 或windows 计划任务来实现此目的。 不要将其隐藏在用户经常访问的文件中。这似乎可以实现您的目标,但我看到类似的错误决定确实会降低网站性能。
  • 我该怎么做呢?以前从未听说过这件事。
  • 我发现了一些关于 cronjobs 的信息,但它只显示与时间相关的内容(比如每个星期五)。那不是我的事。我的变量变化不是在一个确切的时间......

标签: javascript php jquery mysqli


【解决方案1】:

如果在同一执行过程中发生变化,您可以使用

static $previousMachineOn=$MachineOn;
if($previousMachineOn!=$MachineOn){
//changed
$previousMachineOn=$MachineOn;
//handle the change
}

如果这在同一会话期间发生变化,您可以使用

$_SESSION['previousMachineOn']=(array_key_exists('previousMachineOn',$_SESSION)?$_SESSION['previousMachineOn']:$MachineOn);
if($_SESSION['previousMachineOn']!=$MachineOn){
//changed
$_SESSION['previousMachineOn']=$MachineOn
//handle the change
}

如果它在执行期间和会话期间都没有改变,

if(file_get_contents("previousMachineOn.txt")!=$MachineOn)
{
//changed
file_put_contents("previousMachineOn.txt",$MachineOn,LOCK_EX);
//handle the change
}

或者你可以使用一个数据库,或者一个简单的文本文件,告诉它最后一次更新的时间,如果太久了就重新更新

if(file_get_contents("lastupdatetime.txt")-time()>1*60*60)
{
//more than 1 hour since last update.
//update lastupdatetime
file_put_contents("lastupdatetime.txt",time(),LOCK_EX);
//update code goes here
}

或者你可能有一个本地缓存副本和一个 cronjob 来定期更新它。在这种情况下,你可能需要一些方法来处理 cronjob 的竞争条件,删除文件以便及时将其替换为更新的版本(我相信带有 LOCK_EX 的 file_put_contents 应该可以解决问题,但请注意,根据我的经验,LOCK_EX 在 Windows* XP/7 操作系统上是不可靠的/不起作用的)

【讨论】:

    猜你喜欢
    • 2015-01-07
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多