Shopnc Modelの下部に隠されたピット

2645 ワード

この間、ある機能を実現しました.データテーブルのクエリー操作に関して、ローカルとテスト環境のテストを経ても問題ありません.この過程は順調に進んでいるようです.退勤するかどうか考えてみましょう.(時間も早くないようですが)、それから正式な環境の下で最後のテストを行います(何の問題もないと思いますが、結局はデータのクエリーだけで、しかもすでにテストして、データも完璧に出力します);
最後に...ついに思いがけないことが起こりました..
制品のほうはなぜこんなに遅いのか、データのロードができないのかと言っています.の
製品のフィードバックによると、私は関連プログラムを見て、大丈夫だと思います.また、表のフィールドの設計を見てみると、私が追加したいくつかのフィールドにはインデックスを追加すべきものがありますが、私は追加していません.加えて、テストの下ではほとんど同じように遅く、ほとんどデータのロードができません.の
テスト環境のいくつかのプロファイルを見て、正式な環境のプロファイルと比較しても、問題は見つかりませんでした.
質問をする...
△この時、思考は死角に陥ったようだ..
 
主管の注意深い検査を経て、やっと問題がどこに現れたかを発見しました.の
Modelの下部には、すべてのテーブル名とプライマリ・キーを含むキャッシュ・ファイルがあるのですが(プログラムの実行時に実行にロードされていないか、保存時にキャッシュ・ファイルに保存されていないようです)、プログラムがテーブルに対する操作に触れるたびに、すべてのテーブルをサーバに再検索し、どんなに恐ろしいか考えてみましょう.
このことをまとめると、以下の問題が反映されます.
1.プログラムの論理判断が厳格ではない!
以上のキャッシュファイルのロードに失敗したり、キャッシュファイルにデータを保存したりして成功しなかったりすると、ログに反映されます.それは、位置決め問題が発生した原因がより速く、より正確ではないかということです.
2.問題を調べる考え方が限界すぎる!
いつも一つの面で問題を考えているようで、現在の思考パターンから飛び出して他の角度に立って問題を考えるのは難しい.これは自分の問題かもしれない.(思考が柔軟でない、あるいは経験が足りない)
3.システムの下部フレームワークの実現原理が足りない!
日常の開発で忙しいかもしれませんが、私たちはある方法を使うことにとどまっています.その底の実現原理を深く理解していません.
これでは問題が発生し、受動的になります!
以上のまとめではまだまだ足りないかもしれませんが、重要なのは必ずソースコードを読むことです!
 
コードクリップ:
/**
     *  
     *
     * @param string $table
     * @return
     */
    public function tableInfo($table)
    {
        if (empty($table))
            return false;
        // ,find(2) 
        if (file_exists(BASE_DATA_PATH . '/cache/fields/_pk.php')) {
            $this->fields = require(BASE_DATA_PATH . '/cache/fields/_pk.php');
        } else {
            $full_table = Db::showTables();
            $_pk_array = array();
            $count = strlen(C('tablepre'));
            foreach ($full_table as $v_table) {
                $v = array_values($v_table);
                if (substr($v[0], 0, $count) != C('tablepre'))
                    continue;
                $tb = str_replace(C('tablepre'), '', $v[0]);
                $fields = DB::showColumns($tb);
                foreach ((array) $fields as $k => $v) {
                    if ($v['primary']) {
                        $_pk_array[$tb] = $k;
                        break;
                    }
                }
            }
            $this->fields = $_pk_array;
            F('_pk', $_pk_array, 'cache/fields');
        }
        return $this->fields[$table];
    }