我制作了一个循环运行的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分钟,具体取决于您的要求。