【问题标题】:PHP script slow on server, but fast in localPHP 脚本在服务器上速度慢,但在本地速度快
【发布时间】:2013-06-24 04:27:22
【问题描述】:

首先我想说我的英语很差,但我要试试。

我尝试在我的 PC 上使用 wamp 服务器运行一个 PHP 脚本,它工作正常,但是当我上传时,由于某种原因,它花费了很多时间来完成主机上的执行,并且几乎总是以服务暂时不可用错误(主机关闭连接)。

我使用了一些 die() 来查看问题出在哪里,我发现它是一个 for 循环,我正在制作一个大字符串(我只是连接起来制作一个大 INSERT 以便在循环后执行它) .而且这个循环在本地工作......我不明白为什么不能在主机上工作。

//insertar valores en bbdd
$sql = "Insert into valor values ";
$primer = 1;

$tiempo_inicio = microtime(true);

for($i = 0 ; $i <= count($array2) - 1 ; $i++)
{   

    //insertar glucosa
    if(!$array2[$i][1] == "")
    {
        if (!$primer) $sql .= ", "; 
        else $primer = 0;

        $sql .= "('" . $this->paciente . "', '" . $array2[$i][0] . "', 'Glucosa', " . $array2[$i][1] . ")";

        $this->Comprobar_Aumentar_Avisos($array2[$i][0], $array2[$i][1]);
    }

    //insertar raciones
    if(!$array2[$i][2] == "")
    {
        if (!$primer) $sql .= ", "; 
        else $primer = 0;

        $sql .= "('" . $this->paciente . "', '" . $array2[$i][0] . "', 'Raciones', " . $array2[$i][2] . ")";

    }

    //insertar insulina
    if(!$array2[$i][3] == "")
    {
        if (!$primer) $sql .= ", "; 
        else $primer = 0;

        $sql .= "('" . $this->paciente . "', '" . $array2[$i][0] . "', 'Insulina', " . $array2[$i][3] . ")";    
    }
}

$tiempo_total = microtime(true) - $tiempo_inicio;

die($tiempo_total);


if ($sql != "Insert into valor values ") {
    $AccessBD = new TAccessBD;
    $AccessBD->usuario = $this->paciente;
    $AccessBD->Inicialitzar_BD();
    $AccessBD->query = $sql;
    $res = $AccessBD->Ejecutar_SQL();   
    $AccessBD->Finalitzar_BD();
    unset($AccessBD);
}

【问题讨论】:

  • 你的意思是 if 语句是这样的!($array2[$i][1] == "") 而不是!$array2[$i][1] == ""
  • 您可能隔离了错误的代码,请参阅Remote Debugging and Memory Profiling in PHP。此外,准备好的语句比手动 INSERT 值列表连接更快(更简单)。
  • $array2 中有多少条目?
  • 几乎很难回答您的问题。我的建议是在代码中插入一些调试信息,例如... echo time()." Start processing value ".$i."\n"; echo time()." End processing value ".$i."\n"; end 然后尝试找出瓶颈在哪里。一些提供商在某些条件下限制了可用的数据库连接速度(几分钟内查询过多,允许banda 连接超过配额,...)让我们知道!
  • @StefanoRadaelli 是的,我放了这样的东西。我已经将 die() 放在循环之前并看到我到达了那里,然后在循环之后移动了 die() 以了解它何时完成以及它花费了多少时间。在本地,我到达了 die(),但在服务器上……我从来没有到达那里,它总是在加载,直到出现错误。我将更新我帖子的代码以显示 die()。也许我应该使用 mario 所说的准备好的语句而不是 concatenate。

标签: php performance local host


【解决方案1】:

问题是在循环中我在这个函数中访问了太多次数据库:$this-&gt;Comprobar_Aumentar_Avisos($array2[$i][0], $array2[$i][1]);

在本地访问没有问题,因为本地数据库,但是在服务器上,数据库也在其他外部主机上,速度很慢。

所以我解决了这个问题,将访问数据库的次数减少到了最低限度,现在它工作正常。

非常感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多