2011-08-24 13 views
22

Zbudowałem stronę społecznościową w CodeIgniter, która teraz pobiera sporo ruchu, firma hostingowa zaczęła narzekać i mówi, że baza danych otrzymuje połączenia zerowe, a także połączenia, które nie są dostępne. t jest zamknięty.Nieodebrane połączenia z bazami danych CodeIgniter

Nie jestem do końca pewien, co to jest zapytanie zerowe lub jak zostanie wydane, jakie są pomysły?

Dodałem dodatkowy kod, aby wymusić ścisłe połączenia, gdy kod dojdzie do końca, ale najwyraźniej to nie działa.

Czy ktoś może sugerować, gdzie szukać lub rozpocząć debugowanie takiego problemu?

Dzięki

Mam następujący na dnie mojego rdzenia MY_Controller

public function __destruct() { 
    $this->db->close(); 
} 
+4

3 odpowiedzi, a nie jeden z nich jest rzeczywiście odpowiedzią na pytanie. –

+0

Czy Twój hostingowiec wskazał, czym jest "połączenie zerowe"? – hakre

+0

Niestety nie mam żadnych szczegółów dotyczących problemu zerowego, od hosta: wiele połączeń z witryny, w której samo zapytanie jest "NULL" – ArthurGuy

Odpowiedz

2

próbowałeś zrobić $this->db->close(); po kwerenda jest wykonany?

6

CodeIgniter powinien automatycznie zamyka połączenie z bazą danych, ale można nazwać to w sposób dorozumiany z $this->db->close();

Zobacz http://codeigniter.com/user_guide/database/connecting.html

+0

Nie o to pyta. Powiedział, że już zamyka połączenia na końcu, ale to nie działa, więc chce jakiś sposób na debugowanie problemu. –

23

myślę, że jesteś gettting problemns z początkowej konfiguracji połączenia z bazą danych CodeIgniter.

Na tej stronie można zobaczyć każdą wartość z tablicy config:
http://ellislab.com/codeigniter/user-guide/database/configuration.html

$db['default']['hostname'] = "localhost"; 
$db['default']['username'] = "root"; 
$db['default']['password'] = ""; 
$db['default']['database'] = "database_name"; 
$db['default']['dbdriver'] = "mysql"; 
$db['default']['dbprefix'] = ""; 
$db['default']['pconnect'] = TRUE; 
$db['default']['db_debug'] = FALSE; 
$db['default']['cache_on'] = FALSE; 
$db['default']['cachedir'] = ""; 
$db['default']['char_set'] = "utf8"; 
$db['default']['dbcollat'] = "utf8_general_ci"; 
$db['default']['swap_pre'] = ""; 
$db['default']['autoinit'] = TRUE; 
$db['default']['stricton'] = FALSE; 

To jest to podstawowa baza danych config tablica, spróbuj ustawić zmienną p Starannie podłączyć do FAŁSZ, gdy jest on włączony , system nie zamyka żadnego połączenia i pozostaje otwarty na zapytania o wiadomości w dowolnym momencie.

Jeśli ustawisz na false, tak jak powiedziałem, twój system będzie działał idealnie, ale koder zamknie się i otworzy połączenie, gdy będzie potrzebował korzystać z bazy danych.

Tutaj możesz znaleźć i zamieścić na forum codeigniter z facetem, który ma problem ze zmiennymi pconnect, może ci pomóc! http://codeigniter.com/forums/viewthread/177573/#842016

+1

Dzięki za komentarz, ale zmienna pconnect jest już ustawiona na false. – ArthurGuy

+0

pconnect = false działa .. Dziękuję .. –

0

Miałem ten sam problem jakiś czas temu, a rozwiązanie było wieloczęściowe (żadna część problemu nie pojawiła się, dopóki wszystkie części nie stały się problematyczne). Program PConnect powinien być wyłączony, chyba że wiesz, jak go używać (jak powiedzieli inni).

Kolejną kwestią do rozważenia jest to, czy twój serwer sieciowy jest wątkowany (np. Tryb roboczy Apache - najczęstsze serwery WWW). Jeśli dostajesz dużo ruchu, a twoje wątki nie zamykają się szybko, możesz uderzać w kilka współbieżnych limitów połączenia serwer/serwer bazy danych lub wyczerpujące zasoby pamięci/procesora. To może spowodować zawieszenie niektórych połączeń z bazą danych.

Sprawdzam więc inne oznaki problemu i nie zakładam, że źródłem jest baza danych. To może być objaw. Czy masz jakieś informacje na temat zerowych połączeń (na przykład, który użytkownik bazy danych je zainicjował)? To może ci pomóc w śledzeniu ...

Edit: Jedno zapomniałem - czasami błędy PHP mogą zepsuć operacji zniszczeniu CI (która automatycznie zamknąć połączenia z mojego zrozumienia), więc może sprawdzić swój błąd rejestruje też.

1

Miałem podobne problemy z CodeIgniter w przeszłości i zostały spowodowane przez trwałe połączenia w MySQL, który jest domyślnie włączony w CodeIgniter. Użyłem kwerendy SHOW PROCESSLIST w MySQL, aby wyświetlić otwarte połączenia, ich bieżącą uruchomioną kwerendę, czas (w sekundach), z którym połączenie zostało otwarte itd. Jeśli połączenie jest bezczynne, zwrócone pole Command zawierałoby pole Sleep i Info (zapytanie) to NULL, co prawdopodobnie oznacza twój host. To dobre miejsce, by zacząć od takiego problemu.

Inną rzeczą, na którą chciałbym zwrócić uwagę, jest niuans PHP, mysql_close, który jest nazywany here z metody kontrolera __destruct, która nie zamknie trwałego połączenia MySQL. PHP zakończy nietrwałe połączenia na końcu wykonywania skryptu, więc zwykle nie jest konieczne wywoływanie go.

Zdaję sobie sprawę z tego, że powiedziałeś, że połączenia trwałe nie zostały włączone, tak właśnie zajęłam się debugowaniem problemu, który brzmi bardzo podobnie do twojego problemu.

0

I rozwiązać ten sam problem w jednym miejscu CI zmieniając kierowcy mysql 'do „mysqli” w: database.php:

$db['default']['dbdriver'] = "mysqli"; 
Powiązane problemy