背景
PDO 拡張機能を使用する TeraWURFL 用の新しいデータベース コネクタ ファイルを作成しています。詳細については、こちらをご確認ください
詳細
新しいデータベース コネクタを追加し、構成TeraWurflDatabase_MySQL5_Mine.php
ファイルで同じものを定義しましたTeraWurflConfig.php
(TeraWURFL に付属する多くのコネクタ ファイルが既にあり、構成ファイルの値によって、使用するコネクタが決まります) -
public static $DB_CONNECTOR = "MySQL5_Mine";
次に、新しいクラス ファイルのすべての関数を単体テストしてTeraWurflDatabase_MySQL5_Mine.php
、変更後に同じ値が返されることを確認するテスト スクリプトを作成しました。テストスクリプトで問題に直面しています。
TeraWurflDatabase_MySQL5_Mine.php
すべて正常に動作していますが、と呼ばれる内部の 1 つの関数に問題がありますrebuildCacheTable()
。テスト スクリプトからこの関数を呼び出すと、その関数内の return ステートメントの後、制御がテスト スクリプトに戻りません。-
テストスクリプト内のコードtest_connector.php
-
/*file inclusiong start*/
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/TeraWurfl.php';
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/TeraWurflConfig.php';
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/DatabaseConnectors/TeraWurflDatabase.php'; //this file is same on both setups
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/TeraWurflLoader.php';
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/UserAgentFactory.php';
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/UserAgentUtils.php';
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/WurflConstants.php';
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/WurflSupport.php';
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/UserAgentMatchers/UserAgentMatcher.php';
require_once '/var/cake_1.2.0.6311-beta/app/webroot/Tera-Wurfl_PDO/DatabaseConnectors/TeraWurflDatabase_MySQL5_Mine.php';
/*file inclusiong end*/
$wurflDbPdoObj = new TeraWurflDatabase_MySQL5_Mine();
$wurflDbPdoObj->connect();
$dbObj = $wurflDbPdoObj;
echo "before call";
var_dump($dbObj->rebuildCacheTable());
echo "after call"; //this does not execute if new TeraWurfl() object is initiated below
そして内部のコードTeraWurflDatabase_MySQL5_Mine
-
class TeraWurflDatabase_MySQL5_Mine extends TeraWurflDatabase{
...
...
public function rebuildCacheTable(){
$rebuilder = new TeraWurfl(); //if this object is initiated, return does not happen properly
return true; //this does not return properly.
}
}
これまでの私のデバッグ
$rebuilder = new TeraWurfl();
によって開始されたオブジェクトが適切なオブジェクトである ことを確認しました。
これに絞り込むことができます。$rebuilder = new TeraWurfl();
内部の行をTeraWurflDatabase_MySQL5_Mine
削除すると、return が適切に機能します。
また、既存のコネクタクラスの同じ関数を呼び出すと、そのような問題はありませんTeraWurflDatabase_MySQL5
(ファイルのインクルード部分にTeraWurflDatabase_MySQL5.php
代わりにインクルードして make します) -TeraWurflDatabase_MySQL5_Mine.php
public static $DB_CONNECTOR = "MySQL5";
$wurflDbPdoObj = new TeraWurflDatabase_MySQL5();
$wurflDbPdoObj->connect();
$dbObj = $wurflDbPdoObj;
echo "before call";
var_dump($dbObj->rebuildCacheTable());
echo "after call"; //works
また、両方のケース ( newと existing ) でvar_dump()
作成されたオブジェクトの値も比較しました。そこに問題はありませんでした。$rebuilder = new TeraWurfl();
TeraWurflDatabase_MySQL5_mine.php
TeraWurflDatabase_MySQL5.php
私のコードの何が問題なのかわかりません。何か案が??
更新
さらに、問題はTeraWurfl.php
クラスのコンストラクター内にあることがわかりました。コンストラクターは、データベース コネクタ クラスのオブジェクトを再度開始します -
public function __construct()
{
...
$dbconnector = 'TeraWurflDatabase_'.TeraWurflConfig::$DB_CONNECTOR; //return fails if this object is initiated
if($this->db === false) $this->db = new $dbconnector;
...
}
エラー/警告は表示されずvar_dump()
、既存のデータベース コネクタのケースと比較して問題ないように見えます。そこでも、そのデータベース コネクタ クラスのオブジェクトが開始されます。
更新 #2 - プロファイリング出力http://kpayne.me/2012/02/04/use-register_tick_function-to-profile-your-code/
に
記載されている手順に従ってコード プロファイリングを設定し、表示するように少し変更しました。出力のクラス名、およびここに出力があります-
TeraWurflDatabase_MySQL5_Mine
-のテスト スクリプトのプロファイリング
Array
(
[TeraWurfl ->__construct] => Array
(
[time] => 9.0599060058594E-5
[calls] => 8
)
[TeraWurflDatabase_MySQL5_Mine ->__construct] => Array
(
[time] => 4.3630599975586E-5
[calls] => 4
)
[TeraWurflDatabase_MySQL5_Mine ->connect] => Array
(
[time] => 0.00010228157043457
[calls] => 6
)
[TeraWurflDatabase_MySQL5_Mine ->rebuildCacheTable] => Array
(
[time] => 7.8678131103516E-6
[calls] => 1
)
[show_profile] => Array
(
[time] => 1.7881393432617E-5
[calls] => 1
)
)
しかし、既存のクラスTeraWurflDatabase_MySQL5
の場合、関数呼び出しの詳細を取得できませんでした。これはまた奇妙です-
Array
(
[show_profile] => Array
(
[time] => 0.00024199485778809
[calls] => 1
)
)