sterowniki sqlsrv spowalniają kodowanie?
Zainstalowałem najnowszą wersję CI 2.1.3
Teraz po uruchomieniu zapytania otrzymuję bardzo wolny czas odpowiedzi na coś bardzo prostego, takiego jak:
function Bash(){
$sql = “SELECT * FROM Contacts”;
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}
po wysłaniu zapytania do zdalnej bazy danych. (Serwer SQL 2008)
Kiedy uruchamiam to samo zapytanie w prostym skrypcie PHP na tej samej zdalnej bazie danych. Otrzymuję wyniki natychmiast.
a) Czy ktoś inny doświadczył tego problemu ze sterownikami sqlsrv w kreatorze kodu?
Jeśli tak, jak go rozwiązałeś?
Oto mój ciąg połączenia:
$db['default']['hostname'] = "xxxxx,1433";
$db['default']['username'] = "xx";
$db['default']['password'] = "xxxxxx-xx";
$db['default']['database'] = "xxxxxxxxx";
$db['default']['dbdriver'] = "sqlsrv";
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = TRUE;
$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;
AKTUALIZACJA:
Po uruchomieniu profilera znalazłem następujące elementy.
BAZA DANYCH: baza danych QUERIES: 1 (Ukryj) 0.0659 wybierz * z Kontaktów
Czas ładowania: Klasy podstawowe 0.0428 Czas wykonania kontrolera (Welcome / AzureBash) 58.2173 Całkowity czas wykonania 58.2602
Wydaje się, że zapytanie wykonuje się w ciągu 0,06 sekundy, ale kontroler ładuje się przez minutę.
Nie mam pojęcia, dlaczego tak się dzieje.
Rozwiązanie
Interfejs aktywnych rekordów dla najnowszych sterowników SQLSRV jest błędny.
Pobierz i nadpisuj istniejący interfejs za pomocą tych plików (nadpisz folder sqlsrv w folderze bazy danych w CI):
http://www.kaweb.co.uk/blog/mssql-server-2005-and-codeigniter/
Uwaga: zostały przetestowane z SQL Azure i działają.
$ query-> num_rows (); nie działa z tymi sterownikami, więc radzę zamiast tego użyć licznika. Lub utwórz własne opakowanie.
Ponadto data jest teraz typem obiektu daty w zestawie wyników.
Mam nadzieję, że to pomoże.
Rozwiązanie 2
Jeśli z jakiegoś powodu znajdziesz błąd, który czyni go całkowicie bezużytecznym. Przywróć pierwotnie dostarczony interfejs sqlsrv. Przekonasz się, że przyczyną problemu jest sposób, w jaki oryginalny interfejs wykonuje zapytanie, dlatego utwórz klasę pomocnika bazy danych; użyj $ sql = $ this-> db-> last_query (); aby uzyskać zapytanie, które miałeś wykonać, a następnie w klasie database_helper wykonaj je samodzielnie:
function MakeDbCall ($sql)
{
$serverName = "xxxxx-xxxx-xxx,1433"; //serverName\instanceName
$connectionInfo = array( "Database"=>"xxx", "UID"=>"xx", "PWD"=>"xxxxx","ConnectionPooling" => "1");
$conn = sqlsrv_connect($serverName,$connectionInfo);
$stmt = sqlsrv_query($conn, $sql);
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) ) {
$result_array[] = $row;
}
return $result_array;
}
Utwórz jeden dla tablicy_wiersz.
Powinieneś być w stanie wywołać tę funkcję bezpośrednio z dowolnego miejsca w aplikacji. Korzystając ze sposobu, w jaki active_records konstruuje zapytanie.
Nie jest to idealne rozwiązanie, ale dopóki codeigniter nie posortuje swojej klasy SQLSRV, niewiele możemy zrobić.