Php застрял, потому что для долгой загрузки запроса MySQL в функции PHP, как исправить? - PullRequest
0 голосов
/ 19 августа 2011

Я использую функцию php для получения данных купольной MySQL от другого хоста MySQL, кроме моего веб-сервера.

Функция:

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 implode.

Всего строк, которые я должен получить по $ _POST ['letter'] M, равно +/- 1200; (база данных mp3 в сети)

Может ли кто-нибудь помочь мне исправить эту функцию, чтобы у меня больше не было тайм-аута. Спасибо

1 Ответ

3 голосов
/ 19 августа 2011

Проблема здесь в том, что вы выбираете список из базы данных, а затем отправляете этот список обратно как часть запроса.Вы действительно должны делать большую часть этих вещей в SQL, используя JOIN или вложенные запросы.Это сделает вашу программу намного быстрее.

Сначала создайте таблицу для всех ваших типов и типов.Ваш запрос должен быть таким:

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

Используйте тот же шаблон для объединения ваших запросов.Похоже, вы можете сократить большую часть своего кода здесь до одного SQL-запроса.Вы сэкономите массу времени и памяти, не отправляя все эти данные назад и вперед между вашей программой и базой данных.

Некоторые материалы для чтения для вас:

Соединения SQL: http://beginner -sql-tutorial.com / sql-joins.htm

SQL-запрос: http://beginner -sql-tutorial.com / sql-subquery.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...