【发布时间】:2017-10-19 16:04:35
【问题描述】:
我有 N 台设备通过 HTTP (POST) 请求将它们的数据全部发送到同一个 URL(我们称之为“upload.php”)。每分钟大约有 100-150 个 POST 请求被发送到 upload.php。假设设备发现了气球并发送了这些数据:
[ {
"timestamp" : 1507320877294,
"color" : "red",
"balloon" : {
"x" : 42,
"y" : 312,
"z" : 287,
}
} ]
..
[ {
"timestamp" : 1607320877294,
"color" : "yellow",
"balloon" : {
"x" : 42,
"y" : 312,
"z" : 287,
}
} ]
我在数据库中有一个如下所示的表,并按以下方式聚合数据:
+---------------------------------------------------------------------+
| spotter_sensor_id | hour_collected | red_balloons | yellow_balloons |
+---------------------------------------------------------------------+
| 992 | 17:00:00 | 5 | 5 |
+---------------------------------------------------------------------+
我不想在每次upload.php 收到发布请求时进行更新/插入查询。我宁愿暂时存储数据,然后每 10 分钟左右进行一次查询,例如:
INSERT INTO table
(spotter_sensor_id, hour_collected, red_balloons, yellow_balloons)
VALUES
('992', '$hour_collected', '$red_balloons', '$yellow_balloons')
ON DUPLICATE KEY UPDATE
red_balloons = $red_balloons + VALUES(red_balloons),
yellow_balloons = $yellow_balloons + VALUES(yellow_balloons);
...表示在这 10 分钟内每个传感器发现了多少气球。
对于使用 PHP 7 将中间数据从 upload.php 存储到另一个脚本(我们称之为“send.php”),我有哪些选择?最好是数据死锁或并发不会成为问题的选项?
注意:我的环境是带有 PHP 7 的 Windows Server 2016。我查看了 OPCache,但没有找到适用于 PHP 7 的 DLL——我从 GitHub 上分叉的一个非官方的 DLL 有很多错误。
【问题讨论】:
-
upload.php 的每次执行都是唯一的,所以......临时文件,临时数据库表是显而易见的。不知道还有没有别的...
-
使用内存数据库怎么样?我见过Redis.io 的一些实现
-
为什么,这背后的原因是什么 - 任何类型的性能问题,或者......?
-
@CBroe 我有几十个传感器每秒发送数据,每次传感器上传数据时都无法进行 SQL 查询。最好每 5 分钟聚合一次并在一个 sql 命令中发送数据