Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z max_connections_per_hour w mysqli
Forum PHP.pl > Forum > PHP > Object-oriented programming
adrian1987
Zacząłem obiektowo pisać i od razu narodził się problem... Otóż po chwili przeklikiwania strony wywala mi taki komunikat:
Cytat
Warning: mysqli::mysqli() [mysqli.mysqli]: (42000/1226): User 'XXX' has exceeded the 'max_connections_per_hour' resource (current value: 2000) in /home/XXX/classes/db.php on line 19
Błąd połączenia z bazą danych: User 'XXX' has exceeded the 'max_connections_per_hour' resource (current value: 2000)


Nie wydaje mi się, żebym wykonał 2000 połączeń do bazy mysql... ale pytanie jak rozwiązać ten problem, klasa w db.php wygląda tak:
  1. <?PHP
  2. class Dbclass {
  3. private $host;
  4. private $user;
  5. private $password;
  6. private $database;
  7.  
  8. public function __construct()
  9. {
  10. $this->host = 'localhost';
  11. $this->user = 'xxx';
  12. $this->password = 'xxx';
  13. $this->database = 'xxx';
  14. }
  15.  
  16. public function connect()
  17. {
  18. $this->host;
  19. $mysqli = new mysqli($this->host, $this->user, $this->password, $this->database);
  20. if(mysqli_connect_error()) die ("Błąd połączenia z bazą danych: ".mysqli_connect_error());
  21. $mysqli -> query("SET NAMES UTF8");
  22. return $mysqli;
  23. }
  24. }
  25. ?>


i później w metodach innych klasach, gdzie potrzebuję zrobić coś w bazie to tworze sobie obiekt Dbclass... przykład:
  1. class SEO {
  2. public $id;
  3. public $id_page;
  4. public $keywords;
  5. public $description;
  6. public $title;
  7.  
  8. public function __construct($ID_PAGE = NULL)
  9. {
  10. if(empty($ID_PAGE)) $this -> initialize();
  11. else
  12. {
  13. $sql = "SELECT * FROM `seo` WHERE `id_page`=$ID_PAGE";
  14. $baza = new Dbclass();
  15. $mysqli = $baza -> connect();
  16. $result = $mysqli -> query($sql);
  17. if($mysqli -> error) {echo "Błąd: ".$mysqli->error; exit;}
  18. $x = $result -> num_rows;
  19. if($x==0) $this -> initialize();
  20. else $this->initialize($result -> fetch_assoc());
  21. $mysqli -> close();
  22. }
  23. }
  24. }


Dałoby radę zrobić jakoś tak, że gdzieś na początku kodu strony nawiązuję połączenie i trzymam je do samego końca strony i mam dostęp do tego wewnątrz metod innych klas?? Wtedy miałbym na przeładowanie strony 1 połączenie z bazą a nie kilka...
blooregard
Wygląda na to, że gdzieś zapętliłeś konstruktor klasy SEO (strzelam teraz).

Co jest w metodzie initialize() w klasie SEO?

  1. public function connect()
  2. {
  3. $this->host;
  4. $mysqli = new mysqli($this->host, $this->user, $this->password, $this->database);
  5. if(mysqli_connect_error()) die ("Błąd połączenia z bazą danych: ".mysqli_connect_error());
  6. $mysqli -> query("SET NAMES UTF8");
  7. return $mysqli;
  8. }

Co ma robić ta pierwsza linijka w tej metodzie?
adrian1987
wyżej tylko fragment 1 klasy wstawiłem... w initialize jest tylko podstawienie z tablicy $result do zmiennych w klasie...
generalnie tych klas jest kilka i w każdej z klasy są metody, które korzystają z połączenia do bazy...
pierwsza linijka to zostało po czymś... biggrin.gif poprostu nie usunąłem... ona nic nie robi... biggrin.gif

  1. private function initialize($RESULT = NULL)
  2. {
  3. if(empty($RESULT))
  4. {
  5. $this->id = $this->id_page = $this->keywords = $this->description = $this->title = NULL;
  6. }
  7. else
  8. {
  9. $this->id = $RESULT['id'];
  10. $this->id_page = $RESULT['id_page'];
  11. $this->keywords = stripslashes($RESULT['keywords']);
  12. $this->description = stripslashes($RESULT['description']);
  13. $this->title = stripslashes($RESULT['title']);
  14. }
  15. }
blooregard
A weź zajrzyj do logów mysql-a i Apache'a.
adrian1987
A mógłbyś mnie poinstruować jak mam to zrobić? Bo szczerze mówiąc nie mam zielonego pojęcia jak mam tam zajrzeć i na co zwrócić uwagę...
blooregard
Jeśli korzystasz z Linuksa, logi masz w katalogu /var/log (dla Apache może być jeszcze osobny katalog) i jest to error.log i access.log (Apache) oraz mysql.log oraz mysql.err dla MySQL-a.
W przypadku Windows te pliki znajdują się bodajże w ich katalogach w C:/Program Files, chyba, że masz je zainstaowane gdzie indziej.

Apache:
http://httpd.apache.org/docs/1.3/logs.html

MySQL:
http://dev.mysql.com/doc/refman/5.1/en/error-log.html
Pilsener
Cytat
Wygląda na to, że gdzieś zapętliłeś konstruktor klasy SEO (strzelam teraz).
- otóż to, postuluję by na początek zakomentować łączenie się z bazą danych w klasie i zrobić to tradycyjnie, na początku pliku index.php (jeśli się da to prosto zrobić oczywiście).

Masz też złą koncepcję obsługi bazy, powinieneś robić łączenie tylko w jednym miejscu (np. klasie DB), natomiast pozostała obsługa bazy (Modele) powinny dziedziczyć po klasie DB:
  1. class Model_Select extends Dbclass {
  2.  
  3. //tu metody pobierające i zwracające dane z bazy
  4.  
  5. }


Bo bez sensu jest za każdym razem robić:
  1. $baza = new Dbclass();
  2. $mysqli = $baza -> connect();



Można też użyć singletona, choć wielu to krytykuje, bo nie zawsze jest potrzebne połączenie z bazą danych.
adrian1987
Właśnie teraz chciałbym to tak przerobić, żeby w 1 miejscu się połączyć i trzymać to połączenie do samego końca strony...
Mam takie pytanie, czy w php istnieje taka możliwość żeby w klasie zadeklarować jakąś zmienną statyczną i wtedy $mysqli bym wrzucił do bazy Dbclass jako właśnie zmienną statyczną, a dodatkowo w pozostałych klasach gdzie łączę się z bazą zrobił dziedziczenie do Dbclass, żeby mieć dostęp do tej zmiennej $mysqli... Co o tym myślicie?
quality
  1.  
  2. class Dbclass {
  3.  
  4. protected static $resource;
  5.  
  6. protected function getDb()
  7. {
  8. return self::$resource;
  9. }
  10.  
  11. }


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