CI 2.1.3 の最新バージョンをインストールしました
クエリを実行した後、次のような非常に単純なものに対して応答時間が非常に遅くなります。
function Bash(){
$sql = “SELECT * FROM Contacts”;
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt === false) {
die( print_r( sqlsrv_errors(), true) );
}
リモートデータベースにクエリを実行した後。(SQL サーバー 2008)
同じリモート データベースに対して単純な PHP スクリプトでこの同じクエリを実行すると、すぐに結果が出ます。
a) codeigniter の sqlsrv ドライバーでこの問題を経験した人はいますか?
もしそうなら、どのように解決しましたか?
ここに私の接続文字列があります:
$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;
アップデート:
プロファイラーを実行すると、次のことがわかりました。
DATABASE: データベース QUERIES: 1 (非表示) 0.0659 select * from Contacts
読み込み時間: 基本クラス 0.0428 コントローラー実行時間 ( Welcome / AzureBash ) 58.2173 合計実行時間 58.2602
クエリは 0.06 秒で実行されているように見えますが、コントローラーの読み込みには 1 分かかります。
なぜこれが起こっているのか分かりません。
解決
最新の SQLSRV ドライバーのアクティブ レコード インターフェイスにはバグがあります。
そのため、既存のインターフェイスをダウンロードして上書きします (CI のデータベース フォルダーにある sqlsrv フォルダーを上書きします)。
http://www.kaweb.co.uk/blog/mssql-server-2005-and-codeigniter/
注: これらは SQL Azure でテストされ、動作します。
$query->num_rows(); はこれらのドライバーでは機能しないため、代わりに count を使用することをお勧めします。または、独自のラッパーを作成します。
さらに、日付は結果セットの日付オブジェクト タイプになりました。
これが役立つことを願っています。
解決策 2
何らかの理由で、これを完全に使用できなくするバグを見つけた場合。最初に提供された sqlsrv インターフェイスに戻します。問題の原因は、元のインターフェイスがクエリを実行する方法であることがわかります。したがって、データベース ヘルパー クラスを作成します。$sql = $this->db->last_query(); を使用します。実行しようとしていたクエリを取得し、database_helper クラス内で自分で実行します。
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;
}
row_array 用に作成します。
アプリのどこからでも、この関数を直接呼び出すことができるはずです。active_records がクエリを構築する方法を利用しながら。
理想的な解決策ではありませんが、codeigniter が SQLSRV クラスをソートするまで、できることはあまりありません。