0

最新の値を取得するには、1 秒ごとにデータベースから常に読み取る必要があります。これが私のコードです:

    <?php
    // connect to the "tests" database
    $conn = new mysqli('localhost', 'root','','Test');

    // check connection
    if (mysqli_connect_errno()) {
     exit('Connect failed: '. mysqli_connect_error());
    }

    // SELECT sql query
   $sql = "SELECT * FROM `Value`"; 

   // perform the query and store the result
   $result = $conn->query($sql);

   if (!$result)
    print 'Error!';

   // if the $result contains at least one row
   if ($result->num_rows > 0) {
    // output data of each row from $result
     while($row = $result->fetch_assoc()) {
      $output=$row;
    print_r($output);
     }
   } 
   else {
    print '0 results';
   }

   $conn->close();
   ?>

私の HTML コードは、次のように 1 秒ごとに更新されます。

function reload (){
    setInterval(getData,1000);
}

function getData()
  {
    $.get('test.php', function(data) {

        var output = data;

        document.getElementById("output").innerHTML = "Info: " + output;
    }); 
  }
....
<body onload="reload();">

<p id="output"></p>

</body>

すべて正常に動作しますが、約 5 ~ 10 分後に MYSQL サーバーがクラッシュします。過負荷になっていると思います。私の考えは、毎秒接続するたびにphpスクリプトを実行し続けることです。私はこれを間違ってやっていますか?より良い実装に関する提案はありますか?

4

3 に答える 3

2

スクリプトが終了したときにデータベースを「閉じない」ものを探していると思います。

mysqli では、p: を追加することでホスト名を先頭に追加して、いわゆる永続的なデータベース接続を使用できます。

// connect to the "tests" database
$conn = new mysqli('p:localhost', 'root','','Test');

永続的な接続について詳しくは、http://php.net/manual/en/features.persistent-connections.php をご覧ください

于 2013-03-27T06:07:31.120 に答える
0

setTimeout()次のようにコールバックを呼び出して、最後のリクエストが終了してから 1 秒後に次のリクエストを開始しないようにすることもできます。

function getData()
  {
    $.get('test.php', function(data) {

        var output = data;

        document.getElementById("output").innerHTML = "Info: " + output;
        setTimeout(getData, 1000);
    }); 
  }
....
<body onload="getData();">

これは通常、 を使用するよりも優れたアプローチですsetInterval()。2 つの同時接続が発生し、 requestAが request の前に開始され、 request のBに終了する可能性があるためです。これは、何かが発生し、要求を完了するのに 1 秒以上かかったためです。これにより、奇妙な動作が発生する可能性があります。 B

同じ IP から複数の同時接続が開かれているために失敗する可能性があるため、これで問題が解決する場合もあります。

于 2013-03-27T06:00:13.067 に答える
0

はい、もっと良い方法で実装できますDatabase connection configuration毎回同じものを使用している ため、ページの更新時にデータベースに接続して閉じる必要はありません毎秒データベース サーバーに接続すると、非常にコストがかかります

どうしてjust reload/refresh the query statementですか?

アイデアは次のとおりです。

永続的なデータベース接続を使用

永続的な接続が最適な理由については、次の投稿のBlaM の回答を 参照してください。

#load などの別の div にクエリを配置します。

      echo '<div id="load">';
// SELECT sql query
   $sql = "SELECT * FROM `Value`"; 

   // perform the query and store the result
   $result = $conn->query($sql);

   if (!$result)
    print 'Error!';

   // if the $result contains at least one row
   if ($result->num_rows > 0) {
    // output data of each row from $result
     while($row = $result->fetch_assoc()) {
      $output=$row;
    print_r($output);
     }
   } 
   else {
    print '0 results';
   }
       echo '</div>';

jquery 関数を使用して#load div のみを更新する

<script type="text/javascript">
var auto_refresh = setInterval(
function ()
{
$("#load").load("filename.php #load");
}15000); // refresh every 1 second
</script>

これをリーダーボードの自動更新ページに実装しました。完全に機能し、サーバーは 50 時間経過してもクラッシュしませんでした

于 2013-03-27T06:00:59.450 に答える