Php卡住了,因为长时间加载在mysqli查询在Php函数,如何修复


Php stuck because to long load on mysqli query in php function, how to fix?

我使用PHP函数从其他mysql主机获取dome mysql数据,而不是我的web服务器。

功能:

public function theMysqli($build){ // $build is given by othe code (no usedata)
   $mysqli = new mysqli($server, $user, $password, $database);
   $catid = array( /* +/- 40 id's */ );  //data is $catid = configs::songcats();
   $type = array( /* +/- 15 captical letters */ );  //data is $type = configs::songtype();
   $limit = 20;
   $lstart = $_post['page'];
     if($lstart == ''){
        $lstart = 0;
     }
     else{
        $lstart = $lstart * $limit;
     }
   $sletter = $_POST['letter'];
   $search = $sletter.'%';
   $catquery = "SELECT songid FROM category WHERE catID IN('".implode("', '", $catid)."')";
     if ($db = $mysqli->query($catquery)){
    while($row = $db->fetch_array()){
       $idsong[] = $row; 
        }
    $db->close();
     }
   foreach($idsong as $gt){
     $songid[] = $gt['songid'];
   }
   // songid is a array over the 30000 values
   $countquery = "SELECT id FROM songlist WHERE songtype IN('".implode("', '", $type)."') AND id IN('".implode("', '", $songid)."') AND songname LIKE '".$search."'";
     if ($db = $mysqli->query($countquery)){
    $countr = $db->num_rows;
    $db->close();
     }
   $pages = ceil($countr / $limit);
   $songquery = "SELECT id, songname, artist, copyright, duration FROM songlist WHERE songtype IN('".implode("', '", $type)."') AND id IN('".implode("', '", $songid)."') AND songname LIKE '".$search."' ORDER BY songname ASC LIMIT $lstart, $limit";
   if ($db = $mysqli->query($songquery)){
      while($row2 = $db->fetch_array()){
         $result[] = $row2; 
      }
      $db->close();
   }
   if($built == 'counter'){
     $final == $pages;
   }
   else if($build == 'gresult'){
     $final == $result;
   }
   return $final;
}

现在我的问题是加载时间,他需要这个脚本,这将是很长。即使我将php.ini设置为执行可能是300秒,他也会在加载页面时卡住。现在我知道你可以通过一个查询从多个mysql表中获取数据,但我找不到任何解决方案来与php内爆函数相结合。

我必须通过$_POST['letter'] M获得的总行数是+/- 1200;(网络电台mp3数据库)

有人能帮我修复这个功能,所以我没有超时了。由于

这里的问题是,您正在从数据库中获取列表,然后将该列表作为查询的一部分发送回来。实际上,您应该在SQL中使用JOIN或嵌套查询来完成大部分工作。这将使您的程序更快。

首先,为所有字段和类型创建一个表。你的catquery应该是:

SELECT songid 
FROM category 
WHERE catID IN (
    SELECT id
    FROM catids
)

使用相同类型的模式将查询连接在一起。看起来您可以将这里的大部分代码缩减为一个SQL查询。你将节省大量的时间和内存,因为你不必在你的程序和数据库之间来回发送所有的数据。

给你一些阅读材料:

SQL join: http://beginner-sql-tutorial.com/sql-joins.htm

SQL子查询:http://beginner-sql-tutorial.com/sql-subquery.htm