Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Pomocy z optymalizacja
Forum PHP.pl > Forum > Przedszkole
xavierek
Witam prosił bym o pomoc przy optymalizacji kodu ponieważ hosting skarży się na za duże użycie procesosora skrypt jest wykonywany raz na 5 min array zwracany to okolo 400 wierszy wykonywany 100 razy ,obciecie danych wchodzacych do preg mach odpada bo bardziej obciaza serwer
  1. $ppp=1; while($ppp<=100) { preg_match_all($code, $handler, $data, PREG_PATTERN_ORDER);
  2. $i2 = 0;
  3. $p = 0;
  4. while ($data[0][$i2] != '') {
  5. $userName = addslashes(encodeNamePlayer($data[1][$i2]));
  6. $userLevel = $data[3][$i2];
  7. $userVocationId = $vocations[$data[4][$i2]];
  8. $userId = getuserId($userName);
  9. if ($userId > 0 && $userName != '') {
  10.  
  11.  
  12. $result = mysql_query("SELECT `userVocationId`, `userLevel`, `userWorldId`, `userTotalOnlineTime` FROM `users` WHERE `userId` ='$userId'");
  13. $rr = mysql_fetch_array($result);
  14. $userOldLevel = $rr['userLevel'];
  15. $userOldVocationId = $rr['userVocationId'];
  16. $userOldWorldId = $rr['userWorldId'];
  17. $userTotalOnlineTime = $rr['userTotalOnlineTime']+1;
  18. if ($userOldLevel != $userLevel) {
  19. if($userOldLevel>$userLevel){
  20. mysql_query("INSERT INTO `klorxcom_user_statistics`.`waiting_for_review_by_the_death` (
  21. `userId` ,
  22. `date`
  23. )
  24. VALUES (
  25. '1', '1'
  26. );
  27. ");
  28. }
  29.  
  30. "INSERT INTO `klorxcom_user_statistics`.`user_level_history` (
  31. `userId` ,
  32. `level` ,
  33. `date`
  34. )
  35. VALUES (
  36. '$userId', '$userLevel', '$time'
  37. )");
  38. }
  39. if ($userOldVocationId != $userVocationId) {
  40. "INSERT INTO `klorxcom_user_statistics`.`user_vocation_history` (
  41. `userId` ,
  42. `vocationId` ,
  43. `date`
  44. )
  45. VALUES (
  46. '$userId', '$userVocationId', '$time'
  47. )");
  48. }
  49. if ($worldId != $userOldWorldId) {
  50. "INSERT INTO `klorxcom_world_statistics`.`user_world_history` (
  51. `userId` ,
  52. `worldId` ,
  53. `date`
  54. )
  55. VALUES (
  56. '$userId', '$worldId', '$time'
  57. )");
  58. }
  59. "UPDATE `klorxcom_user_statistics`.`users` SET `userLevel` = '$userLevel',
  60. `userVocationId` = '$userVocationId',
  61. `userWorldId` = '$worldId', `userTotalOnlineTime` = '$userTotalOnlineTime',
  62. `userLastLogin` = '$time' WHERE `users`.`userId` = '$userId' LIMIT 1");
  63. } elseif ($userName != '') {
  64. ## gracz nie istnieje
  65. "INSERT INTO `klorxcom_user_statistics`.`users` (
  66. `userId` ,
  67. `userName` ,
  68. `userLevel` ,
  69. `userVocationId` ,
  70. `userWorldId` ,
  71. `userTotalOnlineTime`,
  72. `userLastLogin` ,
  73. `addToStatistics`
  74. )
  75. VALUES (
  76. NULL , '$userName', '$userLevel', '$userVocationId', '$worldId', '1', '$time', '$time'
  77. )");
  78. $userId = getuserId($userName);
  79. "INSERT INTO `klorxcom_user_statistics`.`user_level_history` (
  80. `userId` ,
  81. `level` ,
  82. `date`
  83. )
  84. VALUES (
  85. '$userId', '$userLevel', '$time'
  86. )");
  87. "INSERT INTO `klorxcom_user_statistics`.`user_vocation_history` (
  88. `userId` ,
  89. `vocationId` ,
  90. `date`
  91. )
  92. VALUES (
  93. '$userId', '$userVocationId', '$time'
  94. )");
  95. "INSERT INTO `klorxcom_world_statistics`.`user_world_history` (
  96. `userId` ,
  97. `worldId` ,
  98. `date`
  99. )
  100. VALUES (
  101. '$userId', '$worldId', '$time'
  102. )");
  103. } else {
  104. ##cos nie tak
  105. }
  106. if ($userId > 0) {
  107. "INSERT INTO `klorxcom_user_statistics`.`user_online_data` (
  108. `userId` ,
  109. `worldId` ,
  110. `date`
  111. )
  112. VALUES (
  113. '$userId', '$worldId', '$time'
  114. )");
  115. }
  116. $i2 ++;
  117. $p ++;
  118.  
  119. }
  120. mysql_query ( "INSERT INTO `world_players_history` (
  121. `world_id` ,
  122. `players_online` ,
  123. `date`
  124. )
  125. VALUES (
  126. '$worldId', '$p', '$time'
  127. )");
  128. }
  129.  
  130.  
  131. mysql_query("OPTIMIZE TABLE `users` , `user_level_history` , `user_online_history` , `user_vocation_history` , `user_world_history`");
  132. )");
zend
Zamiast pobierać dane w pętli zrób
  1. $userIds = array(); //tablica z identyfikatorami uzytkownikow
  2. $where = 'where userId IN('. implode(',' , $userIds) .')';


A inserty możesz wykonywać też w takiej formie, łącząc w php kolejne rekordy i wykonując inserta na samym końcu skryptu, wtedy zamiast 100 zapytan do jednej tabeli pójdzie jedno wielkie, co jest wydajniejsze
  1. INSERT INTO `x` ('user_id', 'nick') VALUES ('1', 'a'), ('2', 'b'), ('3', 'c')
  2.  


Poza tym wszystkie zapytania obejmij transakcją, wtedy nie musisz się też obawiać o naruszenie struktury danych, znacząco wzrośnie też wydajność

  1. query('START TRANSACTION');
  2.  
  3. $result = query('SELECT * from ...');
  4.  
  5. foreach($result as $row)
  6. {
  7. //processing
  8. //creating inserts
  9. }
  10.  
  11. query($insert1);
  12. query($insert2);
  13. query('commit')
  14.  
  15. query('commit');
  16.  


Jako typ tabel ustaw innoDb, jest ono przystosowane do częstego wstawiania rekordów, myisam jest natomiast nastawione na szybkie wybieranie danych i wstawianie nowych rekordów jest tam wolniejsze
toffiak
Z listingu wynika że wykonujesz to samo 100 razy czy rzeczywiście jest to ten sam fragment kodu nie różniący się żadnymi danymi wejściowymi czy może jednak dane wejściowe się zmieniają i dlaczego pętla ta jest wykonywanana 100 razy ?

W głównym while-u jest jeszcze jeden który wykonuje się X razy, trudno powiedzieć dokładnie ile nie znając danych wejściowych, ale 100 razy X obiegów razy kilka zapytań w jednym obiegu to daje ogromną ilość zapytań.
xavierek
100 razy dostaje nowe dane ktore sa pobierane z serwera w postaci chotycznego ciagu znakow mam takie pytanie czy da sie zrobic np 10 updatow bazy w jednym zapytaniu ? bo juz inserty zrobilem ze sa wszystkie na raz
zend
Nie jestem do końca pewny czy to zadziała, ale spróbuj połączyć wszystkie zapytania update średnikiem, i też wykonać na końcu, ale nie jestem pewny czy nie ma limitu, że jednym zapytaniem można zrobić jeden update, jeśli nie, a w grę wchodziła by zmiana rozszerzenia na mysli to jest mysqli::multi_query. Jeśli żadna z metod Ci nie pasuje to musisz wykonywać zapytania pojedynczo, ale itak transakcja zrobi swoje i znacząco poprawi wydajność
xavierek
zrobiłem wszystko poczekam chwile i zobaczę czasy smile.gif potem poklikam pomogl jak skoncze walke z tym

Witam ponownie mam jeszcze jakies pytanie czy moge zrobic zapytanie
  1. $result = mysql_query(
  2. "INSERT INTO `klorxcom_tibia_statistics`.`user_online_data` (
  3. `userId` ,
  4. `worldId` ,
  5. `date`
  6. )
  7. VALUES $allonlineuser")



  1. $allonlineuser = array('userId'=>'1', 'worldId'=>'1', 'date'=>'1234' )


czy jezeli bede mial tak przechowywane zebrane dane i dam w zaputaniu tablice to bedzie działać ?
zend
Jeśli podasz tablice to nie zadziała, potrzebny jest string, spróbuj tak
  1. $insert1 = array();
  2.  
  3. if(!count($results)) {return;}
  4.  
  5. foreach($results as $row)
  6. {
  7. $arr = array('userId'=>'1', 'worldId'=>'1', 'date'=>'1234' );
  8. $insert1[] = '(' . join(',' , $arr) . ')';
  9. }
  10.  
  11. query( 'INSERT INTO x (`a`,`b`,`c`) VALUES ' . join(',' , $insert1) ) ;
xavierek
zrobiłem to za pomoca implode(); smile.gif jak narazie wszystko działa ok
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.