1

さて、私はシャウトボックスを作成しました。私はしばらくの間それを使用してきましたが、つい最近、スクリプトへの呼び出しが非常に多いために CPU 使用量を消費することに気付きました。パフォーマンスの修正に取り掛かります。

これは、シャウトボックスの js スクリプトです。

var current_shouts = 0;
            function $shoutid(eleid) {
                return document.getElementById(eleid);
            }
            function urlencode(u) {
                u = u.toString();
                var matches = u.match(/[\x90-\xFF]/g);
                if (matches) {
                    for (var mid = 0; mid < matches.length; mid++) {
                        var char_code = matches[mid].charCodeAt(0);
                        u = u.replace(matches[mid], '%u00' + (char_code & 0xFF).toString(16).toUpperCase());
                    }
                }
                return escape(u).replace(/\+/g, "%2B");
            }
            function shouts() {
                clearTimeout(getshout);
                var xmlHttp = (window.XMLHttpRequest) ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP");
                xmlHttp.open("GET", "shoutbox/shouts.php?i=" + Math.random());
                xmlHttp.onreadystatechange = function() {
                    if (this.readyState == 4) {
                        if (parseInt(this.responseText) > current_shouts) {
                            getshouts();
                            current_shouts = parseInt(this.responseText);
                        }
                        getshout = setTimeout("shouts()", 1000);
                    }
                }
                xmlHttp.send(null);
            }
            function getshouts() {
                var xmlHttp = (window.XMLHttpRequest) ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP");
                xmlHttp.open("GET", "shoutbox/getshouts.php?i=" + Math.random());
                xmlHttp.onreadystatechange = function() {
                    if (this.readyState == 4) $shoutid("shoutbox").innerHTML = this.responseText;
$shoutid("shoutbox").scrollTop = $shoutid("shoutbox").scrollHeight;
                }
                xmlHttp.send(null);
            }
            function push_shout() {
                shout();
                return false;
            }
            function shout() {
                var xmlHttp = (window.XMLHttpRequest) ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP");
                xmlHttp.open("POST", "shoutbox/shout.php");
                var data = "user=" + urlencode($shoutid("user").value) + "&" + "shout=" + urlencode($shoutid("shout").value);
                xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                xmlHttp.setRequestHeader("Content-length", data.length);
                xmlHttp.onreadystatechange = function() {
                    if (this.readyState == 4) {
                        if (!this.responseText) $shoutid("shout").value = "";
                        else {
                            alert(this.responseText);
                        }
                        getshouts();
                    }
                }
                xmlHttp.send(data);
                return true;
            }
            var getshout = setTimeout("shouts()", 1000);

jsに関しては、私は本当に明るいクレヨンではないので、これを修正する方法がよくわかりません。への呼び出しshouts.phpは、実際に私の CPU を食い尽くしているものです。

ここにスクリプトがありますshouts.php

<?php
$db = new mysqli('localhost', 'username', 'pass', 'database');

if($db->connect_errno > 0){
   die('Unable to connect to database [' . $db->connect_error . ']');
}
    $stmt = $db->query("SELECT COUNT(id) FROM shout");
    while ($shout = $stmt->fetch_assoc()) {
    echo implode($shout);
    }
session_write_close();
?>

セッションのロックの問題について調べたので、追加しましたsession_write_close();が、これは私の問題にはまったく役立たないようです。

どんなヒントでも大歓迎です!

4

2 に答える 2

2

これは、コードのチューニングが必ずしも全体に役立つとは限らないものの 1 つです。基本的に、自分のハードウェアを攻撃する DDoS です。当面の私の提案は、javascript setTimeout の頻度を1000から2000またはそれ以上に上げることです。長期的には、ハードウェアのアップグレード、より高速で軽量なストレージ ソリューションへの移行 (個人的には Redis がお気に入りです) はどちらも賢明です。

于 2012-12-07T22:49:56.853 に答える
0

出力をキャッシュする基本的なコードを次に示します。これにより、多くの処理を行う必要がなくなります。

$cachefile = 'mycache.txt';
$timeout = 5;

//if there is no cache, or the cache is older that the specified timeout
if( !file_exists($cachefile) || ( filemtime($cachefile) + $timeout < time() ) ) {
   //your existing code here!
   $shouttext = implode($shout);
   echo $shouttext;
   file_put_contents($cachefile, $shouttext);
} else {
   echo file_get_contents($cachefile);
}
于 2012-12-07T23:44:27.730 に答える