如何从PHP CGI脚本中与已运行的PHP CLI脚本进行互补



我制作了一个循环运行的PHP CLI脚本。我从服务器的终端(Windows(运行它。该服务器还充当PHP Web服务器(XAMPP(。

PHP CLI脚本正在处理硬件I/O材料(通过串行端口响应并将逻辑响应并为微控制器板提供逻辑(。总是在运行。

我要完成的工作是制作基于Web的应用程序(PHP CGI(来控制该CLI脚本。喜欢发送一些命令使其做某事。

我尝试过的

我尝试使用一种临时JSON文件。哪个内容由CGI脚本生成。

然后,CLI脚本在每个循环中读取该文件。如果JSON(时间戳(发生了变化,则该脚本使用JSON内部的数据进行相应的操作。然后存储该时间戳将其与JSON进行比较以进行下一个循环。

,但这会导致服务器上的巨大负载,而CLI脚本变得越来越慢。影响微控制器的响应性。

PHP CLI循环是这样的。

<?php
$lastTimestamp=0;
while(true){
    //read json file
    $json=json_decode(file_get_contents("temp.json"));
    if($lastTimestamp < $json->stamp){
        //do something with $json->data
        ...
        //update $lastTimestamp
        $lastTimestamp = $json->stamp;
    }
    //rest of microcontroller logic here
    ...
}

和temp.json文件类似于

{
  "stamp": 1557653475,
  "data": {
    "nd_a": 1,
    "nd_b": 1,
    "nd_c": 0
  }
}

因此,问题是如何在不使用上述方法的情况下与CGI脚本已经运行的PHP CLI脚本进行互补?期望一种不会影响服务器负载和性能的更好方法。

编辑:我还尝试使用数据库代替JSON文件,但性能仍然不好。

这种方式效率低下。最简单的方法是完成执行CLI脚本的CRON作业。如果您使用的是Linux系统,则是您如何设置Cron(在Ubunutu上(https://help.ubuntu.com/community/cronhowto

然后在您的CLI脚本中,您删除循环,作业将读取temp.json(每次工作时都会完成(并比较两个时间戳。

现在要保留$ lastTimestamp,我建议在您的CLI脚本旁边创建一个文本文件,并将其存储在该文件中的$ lastTimestamp的值。然后,只有当从JSON检索到的时间戳与文本文件中的时间戳之间存在差异,您可以使用新的时间戳覆盖文本文件。

您可以使用file_put_contents或fopen/fwrite写入文件。

,您的脚本就像以下

<?php
$lastTimestamp=0;
$lastTimeStampFilePath = "lastTimeStampFile.txt";
//read text file
$lastTimestamp=file_get_contents($lastTimeStampFilePath);
    //read json file
    $json=json_decode(file_get_contents("temp.json"));
    if($lastTimestamp < $json->stamp){
        //do something with $json->data
        ...
        //update $lastTimestamp
        file_put_contents($lastTimeStampFilePath, $json->stamp);
    }
    //rest of microcontroller logic here

也许将作业配置为每2分钟或5分钟,具体取决于您的要求。

最新更新