我有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非常错误。< / em>
答案 0 :(得分:0)
你应该知道,每秒3次插入查询对于RDBMS来说是非常低的(或者你只需花费10美元用于额外的RAM模块:)
如果你确实遇到了瓶颈(因为你的硬件尺寸过大,或者因为实际上每秒有数百个,而不是几十个),那么你可能需要切换技术。 关系数据库可能不是正确的解决方案。建议使用Redis缓存,您也可以尝试使用noSQL解决方案或内存表。但最简单的解决方案可能只是整合发射器侧(您的传感器)的数据。