如何减少远程服务器上 mySql DB 的连接计数?我的系统必须每隔一两秒发送一次数据


How to decrease connection count to mySql DB on a remote server? My system must send data every second or two

我的第一篇文章,因为我在任何地方都没有找到这个问题的答案!我看得远远超出了谷歌。:)

描述:

所以我有一个设置,其中arduino设备通过USB串行电缆连接到笔记本电脑,笔记本电脑连接到互联网。

像这样:http://postimg.org/image/cz1g0q2ib/


arduino ---USB---> laptop (transit.py) ---WWW---> server (insert.php)-> mysql DB

PC上有一个python脚本(transit.py)连续运行并侦听COM端口,分析接收的数据并将其转发到远程服务器(免费托管站点)上的文件(insert.php)查看代码以了解其工作原理...

然后是插入.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)

插入.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!";
}
?>

连接.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 的讨论,请参阅此处。您也许可以使用其中一个答案而不会遇到太多麻烦。

另一种 - 可能更好 - 的解决方案是在Python脚本中批处理数据,这样您就不必经常连接到Web服务器。对于时间不重要的应用程序,执行此操作的经典方法是使用消息总线。我不是 Python 主义者,但这应该可以完成这项工作......

您是否尝试创建一个始终处于活动状态的脚本(在这里您建立连接)(S1),然后是其余的?

(S2)在您正在执行操作的脚本中,首先检查连接是否处于活动状态,如果不是重做连接。

脚本末尾关闭 S1 中的连接。