我的第一篇帖子,因为我在任何地方都找不到这个问题的答案!而且我看起来超越了Google .. 🙂
描述:
所以我有一个设置,其中arduino设备通过USB串行电缆连接到笔记本电脑,笔记本电脑连接到互联网.
Like this: http://postimg.org/image/cz1g0q2ib/
arduino ---USB---> laptop (transit.py) ---WWW---> server (insert.php)-> mysql DB
PC上有一个python脚本(transit.py),它连续运行并监听COM端口,分析收到的数据并将其转发到远程服务器(免费托管站点)上的文件(insert.php)
查看代码以了解其工作原理……
然后是insert.php脚本,它接收这些数据(几乎每秒一次),分析它并将其存储在mySql数据库中.
但是,这不是唯一需要mySql连接的文件,因此我在每个此类文件的开头都包含connect.php.
问题:
Warning: mysqli::mysqli() [mysqli.mysqli]: (42000/1226): User 'user' has exceeded the 'max_connections_per_hour' resource (current value: 1500) in /server/connect.php on line 8
由于所有这些数据传输和它的频率(和托管的廉价)我遇到“每小时超过最大连接数”错误.限制是每小时1500,我无法更改它(它是一个远程服务器).不,我不想为托管付费以获得更大的补贴 – 这不是重点 – 问题是我的代码效率低下.我可以拥有一个持久连接吗?喜欢服务?
将数据从python脚本直接发送到远程mysql不是一个选项,因为我无权访问此功能.
码:
transit.py:
try:
ser = serial.Serial('COM4',9600,timeout=4)
except:
print ('=== COULD NOT CONNECT TO BOARD ===')
value = ser.readline()
strValue = value.decode("utf-8")
if strValue:
mylist = strValue.split(',')
print(mylist[0] + '\t\t' + mylist[1]+ '\t\t' + mylist[2])
path = 'http://a-free-server.com/insert.php'
dataLine = {"table": mylist[0], "data": mylist[1], "value": mylist[2]}
toServer = requests.post(path, params=dataLine, timeout=2)
insert.php:
<?php
include 'connect.php';
//some irrelevant code here...
if (empty($_GET['type']) && isset($_GET['data'])) {
$table = $_GET['table'];
$data = $_GET['data'];
$value = $_GET['value'];
if($mysqli->connect_errno > 0){
die('Unable to connect to database [' . $mysqli->connect_error . ']');
}
else
{
date_default_timezone_set("Asia/Hong_Kong");
$clock = date(DATE_W3C);
if (isset($_GET['time'])) {
$time = $_GET['time'];
}
else{
$time = $clock;
}
echo "Received: ";
echo $table;
echo ",";
echo $data;
echo ",";
echo $value;
echo ",";
echo $time;
if ($stmt = $mysqli->prepare("INSERT INTO ".$table." (`id`, `data`, `value`, `time`) VALUES (NULL, ?, ?, ?) ON DUPLICATE KEY UPDATE time='".$time."'"))
{
$stmt->bind_param('sss', $data, $value, $time);
$stmt->execute();
$stmt->free_result();
$stmt->close();
}
else{
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
}
}else{
echo " | DATA NOT received!";
}
?>
connect.php:
<?php
define("HOST", "p:a-free-host.com"); // notice the p: for persistence
define("USER", "user");
define("PASSWORD", "strongpassword1"); // my password. don't look!
define("DATABASE", "databass");
$GLOBALS["mysqli"] = new mysqli(HOST, USER, PASSWORD, DATABASE, 3306);
$count = intval(file_get_contents('conns.txt'));
file_put_contents('conns.txt', ++$count); //just something i added to monitor connections
?>
附:一切正常,所有数据都以相当理想的方式处理,除了超出限制和其他一些隐藏的警告.
有关如何减少连接数但仍然每秒接收数据的任何建议?
最佳答案 如果我正确理解了您的问题,那么您的网站主机很糟糕.如果您每小时限制为1500个连接,并且每个页面都需要连接,这意味着您每小时的页面浏览量不会超过1500;那不是很多.
许多编程语言都支持连接池;在此模型中,服务器在启动时打开一个或多个连接,并且各个页面请求在需要时获得其中一个连接.这减少了打开和关闭连接的开销.有关连接池和PHP的讨论,请参见here.您可以使用其中一个答案而不会有太多麻烦.
替代方案 – 可能更好 – 解决方案是在Python脚本中批量处理数据,这样您就不必经常连接到Web服务器.对非时间关键的应用程序执行此操作的经典之处是使用消息总线.我不是Pythonist,但这应该做的…