0

コードを高速化する方法はありますか? ロードには約15秒かかります...コードを減らす方法が本当にわかりません...値をデータベースに挿入することを考えただけなので、ユーザーは毎回新しい情報をロードする必要はありません..しかし問題は、私の cron は 1 時間に 1 回のロードしか許可しないということです...ロードごとに新しい情報をロードすることで、新しい情報が得られます..

$q1=mysql_query("SELECT * FROM isara");

while($r1=mysql_fetch_array($q1)){

        $named=$r1['name'];
        $idd=$r1['id'];
        $descd=$r1['desc'];
        $online=check_online($named);

        $char = new Character($r1['name'],$r1['id'],$r1['desc']);

        if($online == "online"){
                $char->rank = $i++;    
        }
        else{
                $char->rank = 0;
        }

        $arr[] = $char;

}
?>

<br />
<h2 style="color:green">Online enemies</h2>

<?php
foreach ($arr as $char) {
        if($char->rank>=1){
                echo "<a style=\"color:green\" href=\"http://www.tibia.com/community/?subtopic=characters&name=$char->name\">";
                echo $char->name." ";
                echo "</a>";
                echo level($char->name)."<b> ";
                echo vocation($char->name)."</b> (<i>";
                echo $char->desc." </i>)<br />";
        }
}
?>
<br /> 
<h2 style="color:red">Offline enemies</h2>
<?php
foreach ($arr as $char) {
        if($char->rank==0){
                echo "<a style=\"color:red\" href=\"http://www.tibia.com/community/?subtopic=characters&name=$char->name\">";
                echo $char->name." ";
                echo "</a>";
                echo level($char->name)."<b> ";
                echo vocation($char->name)."</b> (<i>";
                echo $char->desc." </i>)<br />";
        }
}

?>
4

3 に答える 3

0

詳細については、SQL クエリで個別の (*) キーワードを使用しないでください。このhttp://blog.sqlauthority.com/category/sql-coding-standards/page/2/を参照してください。

于 2013-02-09T11:47:06.343 に答える
0

コメントに書いたように、データベース内の名前ごとに 1 回ではなく、1 回ページをフェッチします。

私のコメントの擬似コード:

users = <get users from database>
webpage = <get webpage contents>

for (user in users)
    <check if user exists in webpage>
于 2013-02-09T11:18:46.233 に答える
0

コメントで述べたように、データベースのエントリごとに Web ページを呼び出しています。1 回の呼び出しで約 2 秒かかると仮定すると、速度が大幅に低下します。

ページを 1 回呼び出して、その内容を check_online() 関数にパラメーターとして渡してみてください。そうすれば、コードは次のようになり、大幅に高速化されます。

$content=file_get_contents("http://www.tibia.com/community/?subtopic=worlds&worl‌​d=Isara",0);
$q1=mysql_query("SELECT * FROM isara");

while($r1=mysql_fetch_array($q1)){

    $named=$r1['name'];
    $idd=$r1['id'];
    $descd=$r1['desc'];
    $online=check_online($named,$content);

    $char = new Character($r1['name'],$r1['id'],$r1['desc']);

    if($online == "online"){
            $char->rank = $i++;    
    }
    else{
            $char->rank = 0;
    }

    $arr[] = $char;

}
?>

<br />
<h2 style="color:green">Online enemies</h2>

<?php
foreach ($arr as $char) {
    if($char->rank>=1){
            echo "<a style=\"color:green\" href=\"http://www.tibia.com/community/?subtopic=characters&name=$char->name\">";
            echo $char->name." ";
            echo "</a>";
            echo level($char->name)."<b> ";
            echo vocation($char->name)."</b> (<i>";
            echo $char->desc." </i>)<br />";
    }
}
?>
<br /> 
<h2 style="color:red">Offline enemies</h2>
<?php
foreach ($arr as $char) {
    if($char->rank==0){
            echo "<a style=\"color:red\" href=\"http://www.tibia.com/community/?subtopic=characters&name=$char->name\">";
            echo $char->name." ";
            echo "</a>";
            echo level($char->name)."<b> ";
            echo vocation($char->name)."</b> (<i>";
            echo $char->desc." </i>)<br />";
    }
}

?>

check_online() 関数は次のようになります。

function check_online($name,$content){
    $count=substr_count($name, " "); 
    if($count > 0){ $ex=explode(" ",$name); $namez=$ex[1]; $nameused=$namez; } 
    else{ $nameused=$name; } 
    if(preg_match("/$nameused/",$content)){ $status="online"; } 
    else{ $status="offline"; }     
    return $status; 
}

また、次のようにして高速化することもできます

  1. innodb で非常に悪い select * の使用をやめる
  2. データベースに適切なインデックスを配置して、レコードセットがより速く返されるようにします
  3. PHP 5.4 をインストールすると、特に各反復で新しいオブジェクトを作成するときに高速になります。
  4. xdebug などのバイト コード アクセラレータ/キャッシュを使用する
于 2013-02-09T11:29:11.217 に答える