1

背景
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.phppublic 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.phpTeraWurflDatabase_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
        )

)
4

1 に答える 1

1

このような場合xdebug、以下を使用してなくてもフローをデバッグできます。

declare(ticks=1);
register_tick_function(function(){
    $debug = debug_backtrace();
    echo "Running on line " . $debug[0]['line'] . " in file " . $debug[0]['file'] . "\n"; 
});

編集: 実は、私の例が悪かったので、重要な部分だけを残しました。

于 2012-06-19T08:33:43.187 に答える