4

この問題に対する答えがどこにも見つからなかったので、私の最初の投稿です! そして、私はGoogleをはるかに超えて見ました.. :)

説明:

そのため、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)に転送します。 コードを参照して学習してください。それがどのように機能するか...

次に、このデータを (依然としてほぼ毎秒) 受信して分析し、mySql データベースに保存する insert.phpスクリプトがあります。ただし、これは 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

このすべてのデータ移動とその頻度(およびホスティングの安さ)の結果として、 「1 時間あたりの最大接続数を超えました」というエラーが発生します。制限は 1 時間あたり 1500 で、変更できません (リモート サーバーです)。いいえ、より大きな手当を得るためにホスティングにお金を払いたくありません-それはポイントではありません-問題は私のコードの非効率性です. 永続的な接続を1 つ持つことはできますか? サービスのような?

私はこの機能にアクセスできないため、pythonスクリプトからリモートmysqlに直接データを送信することはオプションではありません。


コード:

トランジット.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
?>

PSすべてが正常に機能し、すべてのデータがかなり望ましい方法で処理されます.

接続数を減らしながら毎秒データを受信する方法について何か提案はありますか?

4

2 に答える 2

0

常に生きているスクリプトを作成しようとしましたか(ここで接続を作成します)(S1)、そして残りは?

(S2) 操作を行っているスクリプトでは、最初に接続が有効かどうかを確認し、再接続されていないかどうかを確認します。

スクリプトの最後で S1 の接続を閉じます。

于 2014-04-02T11:47:02.163 に答える