Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak obejść limit max_connections_per_hour dla MYSQL
Forum PHP.pl > Forum > PHP
japolak
Witam
Jakiś czas temu przeniosłem stronkę na inny serwer.. Niby ładnie pięknie super.. Ale po jakimś czasie zauważyłem, że moja strona czasami się wysypuje.
Okazało się ze bez wcześniejszej informacji na serwerze jest limit połączeń 1 użytkownika za bazą danych mysql. (max_connections_per_hour)

Zastanawiam się jak to obejść:
Wymyśliłem, że mógłbym np stworzyć klikku użytkowników dla mojej bazy - i w przypadku przekroczenia tego limitu php by zmienial mi użytkownika..

tylko zastanawiam się jak najlepiej obsłuzyć taki błąd??
przykład z mojego localhosta:

Warning: mysqli::__construct(): (HY000/1226) User 'juzek' has exceeded the 'max_connections_per_hour' resource (current value: 200)

jakieś sugestie?
Tomplus
Jak przeniosłeś na jakiś darmowy to tak jest.

Ale jeżeli hosting ma limit połączeń na godzinę, a Ty wykorzystujesz ten limit w jednej czy w dwóch sesjach, to oznacza że masz za dużo niepotrzebnych połączeń z bazą.

Pilsener
Na upartego można:
- użyć persistent connection
- cachować wyniki zapytań

Tylko po co? Za chwilę dostaniesz "przekroczona liczba zapytań" albo "zużywasz za dużo pamięci".
Dużo prościej zmienić ustawienia serwera.
japolak
Cytat(Tomplus @ 20.02.2017, 07:39:43 ) *
Jak przeniosłeś na jakiś darmowy to tak jest.

przenioslem się z home.pl na hostinghouse.pl - > dużo taniej a parametry serwera ok. jedynie ten głupi limit 8000 połączeń/h

Cytat(Tomplus @ 20.02.2017, 07:39:43 ) *
Ale jeżeli hosting ma limit połączeń na godzinę, a Ty wykorzystujesz ten limit w jednej czy w dwóch sesjach, to oznacza że masz za dużo niepotrzebnych połączeń z bazą.
i tu jest racja - tak sprawdziłem sobie na localhost ile mi główna strona wysyła zapytań do bazy i wychodzi ze około 40 - 50 / przy limicie na 200 mogę odświeżyć ją 4 - 5 razy.

stronkę pisałem - ucząc się programowania - wiec nie ma tam zbyt pięknego kodu..


Cytat(Pilsener @ 20.02.2017, 08:47:00 ) *
Na upartego można:
- użyć persistent connection
- cachować wyniki zapytań

Tylko po co? Za chwilę dostaniesz "przekroczona liczba zapytań" albo "zużywasz za dużo pamięci".
Dużo prościej zmienić ustawienia serwera.

Poprosiłem o zwiększenie limitu to ponieśli mi na 9000 /h

tak czy siak wróciłem do swojego starego pomysłu (więcej użytkowników bazy danych) i na chwile obecną zrobiłem testy na localhost i wygląda na to że śmiga:

przykładowy skrypt jaki używam na localhost:

  1. function connect_bd(){
  2. error_reporting(E_ERROR);
  3. $user = 'janek';
  4. $pass = 'janek';
  5.  
  6. $ok = $this->get_result($user,$pass);
  7.  
  8. if ($ok ==0){
  9. $user='juzek';
  10. $pass = 'juzek';
  11. $ok = $this->get_result($user,$pass);
  12.  
  13. }
  14.  
  15.  
  16.  
  17. return $ok;
  18.  
  19. }
  20.  
  21.  
  22. function get_result($user,$pass){
  23.  
  24. $result= new mysqli('localhost', $user, $pass, 'kosmosnews');
  25. if (!mysqli_connect_errno()){
  26. $result -> query("SET NAMES 'utf8'");
  27. if (!$result){return false;} else {return $result; }
  28.  
  29. }else{
  30.  
  31. //printf("Connect failed: %s\n", mysqli_connect_error());
  32. $ok = 0;
  33. return $ok ;
  34. }
  35.  
  36.  
  37. }


dzieki temu jak skończy się limit na janek - strona będzie korzystała z limitu juzka. ..
musiałem jedynie wyłączyć wyświetlanie błędów poprzez : error_reporting(E_ERROR);

może to nie jest z byt piękne ale działa..
jeszcze jutro pomyśle nad jakaś alternatywą.
Tomplus
Jednak nadal wg mnie masz coś w pętli, bo jedna reguła:

max_connections_per_hour to ilość POŁĄCZEŃ
a jest jeszcze:
max_queries_per_hour a to ilość ZAPYTAŃ.

Prawdopodobnie z każdym zapytaniem na stronie, otwierasz nowe połączenie, zamiast przesłać połączenie już otwarte do obiektu w którym połączenie MySQL jest wymagane.

#mySQL
A nie lepiej zacząć uczyć używać PDO?
japolak
Cytat(Tomplus @ 21.02.2017, 07:36:00 ) *
Jednak nadal wg mnie masz coś w pętli, bo jedna reguła:

max_connections_per_hour to ilość POŁĄCZEŃ
a jest jeszcze:
max_queries_per_hour a to ilość ZAPYTAŃ.

Prawdopodobnie z każdym zapytaniem na stronie, otwierasz nowe połączenie, zamiast przesłać połączenie już otwarte do obiektu w którym połączenie MySQL jest wymagane.

#mySQL
A nie lepiej zacząć uczyć używać PDO?



Jest tak jak mowisz -> do każdego zapytania otwieram nowe połącznie przez co licznik połączeń nabija się jak szalony..

Wczoraj wziąłem się za mocne poszukiwania rozwiązania tego problemu .. i dziś znalazłem rozwiązanie -> wzorzec Singleton dla połączeń z bazą

juz zaimplementowałem to rozwiązanie na localhost do jednej ze swoich stron i dziala znakomicie..

Otwieram połączenie raz na początku skryptu php i temat z głowy. Jak wprowadzę to do mojej stronki gdzie miałem problem to będzie mogła być odświeżona 50 razy wiecej niż do tej pory.. czyli limit 9k połączeń na godzine w moim przypadku nigdy nie powinien być przekroczony .. no chyba, że strona przeżyje jakiś wielki sukces i nagle ludzie będą tam wchodzić tongue.gif
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.