Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过代码加速?_Php_Performance_Cycle - Fatal编程技术网

Php 如何通过代码加速?

Php 如何通过代码加速?,php,performance,cycle,Php,Performance,Cycle,有没有办法加速我的代码?加载大约需要15秒。。。我真的没有办法减少我的代码。。。我只是想将这些值插入数据库,这样用户就不必每次都加载新信息。。但问题是我的cron每小时只允许1次加载。。。通过在每次加载时加载新信息,它为我提供了新信息 $q1=mysql_query("SELECT * FROM isara"); while($r1=mysql_fetch_array($q1)){ $named=$r1['name']; $idd=$r1['id'];

有没有办法加速我的代码?加载大约需要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 />";
        }
}

?>
$q1=mysql\u查询(“从isara中选择*);
而($r1=mysql\u fetch\u数组($q1)){
$named=$r1['name'];
$idd=$r1['id'];
$descd=$r1['desc'];
$online=在线检查($named);
$char=新字符($r1['name']、$r1['id']、$r1['desc']);
如果($online==“online”){
$char->rank=$i++;
}
否则{
$char->rank=0;
}
$arr[]=$char;
}
?>

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

我的评论的伪代码:

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

for (user in users)
    <check if user exists in webpage>
用户=
网页=
for(用户中的用户)

正如您在评论中提到的,您正在为数据库中的每个条目调用一个网页,假设每次调用大约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 />";
    }
}

?>
您还可以执行以下操作以加快速度

  • 停止使用select*,这在innodb上非常糟糕
  • 在数据库中放置更好的索引,以使记录集更快地返回
  • 安装PHP5.4,因为它更快,尤其是在每次迭代中创建新对象时
  • 使用字节码加速器/缓存,如xdebug

  • 您应该避免在SQL查询中使用distinct(*)关键字
    有关更多信息,请阅读此

    检查联机方法的外观如何?
    函数检查联机($name){$count=substr\u count($name,”);如果($count>0){$ex=explode(“,$name);$namez=$ex[1];$nameused=$namez;}否则{$nameused=$name;}$content=文件获取内容(“http://www.tibia.com/community/?subtopic=worlds&world=Isara",0);如果(preg_match(“/$nameused/”,$content)){$status=“online”}否则{$status=“offline”}返回$status;}
    对,那么您为数据库中的每个名称获取完全相同的页面?取一次,对照多次,就行了!我觉得自己很愚蠢!谢谢它们不再得到维护。看到了吗?相反,学习,并使用or-将帮助您决定哪一个。如果您选择PDO。
    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; 
    }