0

有没有办法加快我的代码?加载大约需要 15 秒...我真的没有看到减少代码的方法...我只是想将值插入数据库,因此用户不必每次都加载新信息..但是问题是我的 cron 每小时只允许 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 查询中使用 distinct (*) 关键字以获取更多信息,请阅读此http://blog.sqlauthority.com/category/sql-coding-standards/page/2/

于 2013-02-09T11:47:06.343 回答
0

正如我在评论中所写,为数据库中的每个名称获取一次页面而不是一次。

我评论的伪代码:

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

正如评论中提到的,您正在为数据库中的每个条目调用一个网页,假设每次调用大约需要 2 秒,那么它会大大降低您的速度。

为什么不调用一次页面并将其内容作为参数传递到 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. 停止使用 select * 这在 innodb 上非常糟糕
  2. 在您的数据库上放置更好的索引以使记录集返回更快
  3. 安装 PHP 5.4,因为它更快,尤其是当您在每次迭代中创建一个新对象时
  4. 使用字节码加速器/缓存,例如 xdebug
于 2013-02-09T11:29:11.217 回答